রানটাইমে জিনিস ভুল হয় — একটি ফাইল হয়তো নেই, ব্যবহারকারীর ইনপুট হয়তো যা প্রত্যাশিত ছিল তা নয়। Python-এর try/except সরাসরি ক্র্যাশ করার বদলে এটি সুন্দরভাবে হ্যান্ডেল করে, নির্দিষ্টভাবে জানার মতো কয়েকটি অংশসহ।
def divide(a, b):
if b == 0:
raise ValueError("Cannot divide by zero.")
return a / b
try:
print(divide(10, 0))
except ValueError as e:
print(f"Error: {e}")raise হলো নিজে একটি exception ওঠানোর উপায়; except হলো যা সেটাকে ধরে।
try:
result = 10 / 0
except ZeroDivisionError as e:
print(f"Specifically caught: {e}")
except Exception as e:
print(f"General error: {e}")এখানে ক্রম গুরুত্বপূর্ণ — একটি নির্দিষ্ট exception টাইপ একটি বেশি সাধারণ টাইপের আগে থাকা উচিত যা নাহলে সেটাকে আগে ধরে ফেলত।
Python-এ একটি else ব্লকও আছে: এটি শুধু চলে যদি কোনো exception না ওঠে। finally যেকোনো অবস্থাতেই চলে, উপরে যা-ই ঘটুক না কেন:
try:
result = divide(10, 2)
except ValueError as e:
print(f"Error: {e}")
else:
print(f"Success: {result}") # only runs if no exception happened
finally:
print("Done.") # always runstry:
value = int("not a number")
except (ValueError, TypeError) as e:
print(f"Bad input: {e}")কোনো টাইপ ছাড়াই except: লেখা আক্ষরিক অর্থে সবকিছু ধরে, এমনকি এমন ভুলও যা আপনি আসলে দেখতে চাইতেন — একটি টাইপো হওয়া ভ্যারিয়েবল নাম, একটি অনুপস্থিত import। এটা বাগগুলো সামনে আনার বদলে চুপচাপ লুকিয়ে ফেলে:
# Avoid this — catches every possible error, including your own bugs:
try:
risky_operation()
except:
pass
# Prefer this — catches runtime problems, but a real code bug still surfaces:
try:
risky_operation()
except Exception as e:
print(f"Something went wrong: {e}")except Exception সাধারণত যতটা প্রশস্ত হওয়া উচিত ততটাই — এটি এখনও Python-এর নিজস্ব অভ্যন্তরীণ সংকেত (যেমন Ctrl+C-এর জন্য ব্যবহৃত একটি) দিয়ে যেতে দেয়, যা একটি bare except: সেটাও গিলে ফেলত।
Traceback ডেভেলপারদের জন্য, ব্যবহারকারীদের জন্য নয়
একটি বাস্তব, ডিপ্লয় করা Python প্রোগ্রামে একটি না-ধরা exception একটি সম্পূর্ণ traceback প্রিন্ট করে — ফাইল পাথ, লাইন নাম্বার, কখনো কখনো ভ্যারিয়েবলের মান — যা ডেভেলপ করার সময় আপনার জন্য অমূল্য, কিন্তু কখনো সরাসরি একজন end user-কে দেখানো উচিত নয়। ঝুঁকিপূর্ণ অপারেশন (ফাইল অ্যাক্সেস, নেটওয়ার্ক রিকোয়েস্ট, user input পার্স করা) try/except-এ মুড়িয়ে দেওয়াই এটাকে একটি পরিষ্কার, নিয়ন্ত্রিত মেসেজে বদলে দেয়।