دروس الوحدة (4/4)
معالجة الأخطاء: حاول/باستثناء
عندما يحدث خطأ ما في وقت التشغيل (القسمة على صفر، مفتاح مفقود، خطأ
عملية على أنواع غير متوافقة) تثير بايثون استثناء. بدون
المعالجة، الاستثناء يقاطع البرنامج. مع try / except معك
يمكن التقاطه وتقرر ما يجب القيام به.
الشكل الأساسي
try:
risultato = 10 / 0
except ZeroDivisionError:
risultato = None
risultato # None- تحتوي الكتلة
try:على رمز قد يفشل؛ - يتم تنفيذ
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، فقم بتعيين السلسلة 'errore' إلى `result`؛ وإلا قم بتعيين الرقم. تقييم "النتيجة".
إظهار التلميح
int('abc') يرفع ValueError.
الحل متاح بعد 3 من المحاولات
تمرين المراجعة
حدد "divide(a, b)" الذي يُرجع a/b لكنه يرفع ValueError مع الرسالة "قسمة صفر" إذا كانت b تساوي 0. ثم اتصل بـdivide(10, 0) داخل محاولة/باستثناء وقم بتعيين سلسلة الاستثناء الذي تم اكتشافه إلى "رسالة".
إظهار التلميح
رفع ValueError('...') داخل الوظيفة؛ امسك باستثناء ValueError كـ e.
الحل متاح بعد 3 من المحاولات
التحدي الإضافي
اكتب كتلة \`try-except\` لتحويل السلسلة \`text_val = "abc"\` إلى عدد صحيح. إذا أدى التحويل إلى ظهور \`ValueError\`، فقم بتعيين \`لا شيء\` إلى \`النتيجة\`. بخلاف ذلك، قم بتعيين الرقم المحول. وأخيرًا، قم بتقييم \`النتيجة\`.
إظهار التلميح
استخدم المحاولة: النتيجة = int(text_val) متبوعة باستثناء ValueError: النتيجة = لا شيء.
الحل متاح بعد 3 من المحاولات