التقط الأعطال المتوقَّعة باستخدام try/except/else/finally، وأطلق استثناءاتك الخاصة للإشارة إلى بيانات غير صالحة.
افتح هذا الدرس في Kodokonالبرنامج الحقيقي يفشل: ملف مفقود، ومُدخَل غير صالح، وشبكة تنقطع. وتشير بايثون إلى هذه الحالات بـالاستثناءات، التي تقاطع التنفيذ وتنتشر صعودًا في مكدس النداءات حتى تلتقطها كتلة try/except. الانعكاس الاحترافي: التقط الاستثناء الأكثر تحديدًا الممكن، وأقرب ما يمكن من المكان الذي تعرف فيه ما ينبغي فعله.
def parse_age(text):
try:
return int(text)
except ValueError:
return None
print(parse_age("34")) # 34
print(parse_age("thirty")) # Noneتحتوي الكتلة الكاملة على أربعة فروع. تضم try الشيفرة المحفوفة بالمخاطر، وتعالج except العطل، وتُنفَّذ else فقط إذا لم يُطلَق أيّ استثناء، وتُنفَّذ finally في كل الحالات - وهي مثالية لتحرير مورد أو للتسجيل. والفائدة من else: إبقاء try في حدّها الأدنى، لترى من نظرة واحدة أيّ سطر يمكن أن يفشل.
values = ["10", "abc", "25"]
total = 0
for value in values:
try:
number = int(value)
except ValueError:
print(f"Skip : {value}")
else:
total += number
finally:
print(f"Process : {value}")
print(total) # 35يمكن لدوالك أيضًا أن تُطلق استثناءاتها الخاصة باستخدام raise، حالما تكون إحدى البيانات المستلَمة غير صالحة: فالفشل الفوري برسالة واضحة أفضل من إنتاج نتيجة خاطئة. عرِّف صنفًا مخصصًا يرث من Exception: عندئذٍ سيتمكن المُستدعي من التقاطه تحديدًا، دون اعتراض أخطاء أخرى عن غير قصد.
class EmptyCartError(Exception):
pass
def checkout(items):
if not items:
raise EmptyCartError("Empty cart.")
return round(sum(items), 2)
try:
print(checkout([]))
except EmptyCartError as error:
print(f"Error : {error}")