মডিউল পাঠ (4/4)
ত্রুটি পরিচালনা: চেষ্টা করুন/ব্যতীত
যখন রানটাইমে কিছু ভুল হয়ে যায় (শূন্য দ্বারা একটি বিভাজন, একটি অনুপস্থিত কী, একটি
বেমানান প্রকারের উপর অপারেশন) পাইথন একটি ব্যতিক্রম উত্থাপন করে। ছাড়া
হ্যান্ডলিং, ব্যতিক্রম প্রোগ্রামে বাধা দেয়। try / except এর সাথে আপনি
এটা ধরতে পারে এবং সিদ্ধান্ত নিতে পারে কি করতে হবে।
মৌলিক রূপ
try:
risultato = 10 / 0
except ZeroDivisionError:
risultato = None
risultato # Nonetry:ব্লকে এমন কোড রয়েছে যা ব্যর্থ হতে পারে;except <ErrorType>:শুধুমাত্র সেই ত্রুটির ধরনটি উত্থাপিত হলেই কার্যকর করা হয়৷tryএর ভিতরে।
ব্যতিক্রম বার্তা ধরা
একটি নামের সাথে ব্যতিক্রম বস্তুকে আবদ্ধ করতে as ব্যবহার করুন:
try:
int("non è un numero")
except ValueError as e:
messaggio = str(e)
messaggio # "invalid literal for int() with base 10: 'non è un numero'"একসাথে একাধিক প্রকার
try:
valore = dati[chiave]
except (KeyError, IndexError):
valore = Noneএকগুচ্ছ প্রকারের ধরনগুলি (বা সাবক্লাস) এর যে কোনো ব্যতিক্রম ধরা পড়ে।
সম্পূর্ণ কাঠামো: চেষ্টা করুন / ছাড়া / অন্য / অবশেষে
try:
n = int("42")
except ValueError:
print("not a number")
else:
print(f"parsed: {n}") # executed only if NO exception occurred
finally:
print("always executed") # executed regardless, even on exceptionelse— কোডের জন্য এটি ব্যবহার করুন যাtryএর সাফল্যের উপর নির্ভর করে। রাখো আলাদা করুন যাতে আপনি দুর্ঘটনাক্রমে সম্পর্কহীন ব্যতিক্রমগুলি ধরতে না পারেন।finally— পরিষ্কার করা যা সর্বদা ঘটতে হবে (একটি ফাইল বন্ধ করা, একটি প্রকাশ করা সম্পদ)। সাফল্য এবং ত্রুটি উভয় উপর মৃত্যুদন্ড কার্যকর করা হয়েছে.
একটি ব্যতিক্রম উত্থাপন করা হচ্ছে: raise
কখনও কখনও আপনি এমন একজন যিনি সংকেত দিতে চান যে কিছু ভুল হয়েছে:
def diviso(a, b):
if b == 0:
raise ValueError("the divisor cannot be zero")
return a / bসবচেয়ে সাধারণ অন্তর্নির্মিত ব্যতিক্রমগুলি আপনি সম্মুখীন হবেন এবং উত্থাপন করবেন:
ValueError— মানটির সঠিক ধরন আছে কিন্তু অগ্রহণযোগ্য (যেমন পার্সিং)।TypeError— প্রকারটি ভুল (যেমনlen(42))।KeyError/IndexError— অনুপস্থিত কী/সূচী৷ZeroDivisionError— শূন্য দ্বারা বিভাজন।FileNotFoundError,PermissionError— ফাইল সিস্টেম অপারেশন।
অন্য এবং অবশেষে চেষ্টা ব্লক মধ্যে ধারা
একটি try ব্লক দুটি অতিরিক্ত ধারা সংজ্ঞায়িত করতে পারে:
else: কোনো ব্যতিক্রম ছাড়াইtryব্লক সম্পূর্ণ হলেই কার্যকর করা হবে।finally: একটি ব্যতিক্রম ঘটেছে কিনা তা বিবেচনা না করে সর্বদা কার্যকর করা হয়। এটি সম্পদ পরিষ্কার করার জন্য আদর্শ (যেমন একটি খোলা ফাইল বা ডাটাবেস সংযোগ বন্ধ করা)।
নিজে চেষ্টা করে দেখুন
int('abc') চেষ্টা করে এমন একটি অভিব্যক্তি লিখুন: যদি ValueError উত্থাপিত হয়, তাহলে স্ট্রিং 'error' কে `result`-এ বরাদ্দ করুন; অন্যথায় নম্বর বরাদ্দ করুন। `ফলাফল` মূল্যায়ন করুন।
ইঙ্গিত দেখান
int('abc') ValueError বাড়ায়।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
ব্যায়াম পর্যালোচনা করুন
`বিভাজন(a, b)` সংজ্ঞায়িত করুন যা a/b প্রদান করে কিন্তু b 0 হলে 'ভাজক শূন্য' বার্তা দিয়ে ValueError উত্থাপন করে। তারপর একটি চেষ্টা/ব্যতিরেকে divide(10, 0) কল করুন এবং ধরা ব্যতিক্রমের স্ট্রিংটিকে `বার্তা` বরাদ্দ করুন।
ইঙ্গিত দেখান
ফাংশনের ভিতরে ValueError('...') বাড়ান; ই হিসাবে ValueError ছাড়া ধরুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
অতিরিক্ত চ্যালেঞ্জ
স্ট্রিং \`text_val = "abc"\` কে পূর্ণসংখ্যাতে রূপান্তর করতে একটি \`try-except\` ব্লক লিখুন। যদি রূপান্তরটি একটি \`ValueError\` বাড়ায়, তাহলে \`None\`কে \`result\` বরাদ্দ করুন। অন্যথায়, রূপান্তরিত নম্বর বরাদ্দ করুন। অবশেষে, \`ফলাফল\` মূল্যায়ন করুন।
ইঙ্গিত দেখান
চেষ্টা ব্যবহার করুন: ফলাফল = int(টেক্সট_ভ্যাল) এর পরে মান ত্রুটি ছাড়া: ফলাফল = কিছুই নয়।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ