استثناها

پایتون از شیءی خاص به نام *استثنا * برای مدیریّت خطاهایی که حین اجرای برنامه رخ می‌دهند استفاده می‌کند. هرگاه پس از رخ دادن خطایی، پایتون مطمئن نباشد که چه باید بکند، یک شیء استثنا می‌سازد. اگر کدی برای رسیدگی کردن به استثنا بنویسید برنامه به کار خود ادامه خواهد داد. اگر استثنا را مدیریّت نکنید برنامه متوقّف شده و یک traceback نمایش داده می‌شود که حاوی گزارشی در مورد استثنایی است که رخ داده است.

رسیدگی به استثناها با بلوک‌های try-except انجام می‌پذیرد. بلوک try-except از پایتون می‌خواهد که کاری انجام دهد و امّا در عین حال مشخّص می‌کند که در صورت رخ دادن استثنا حین انجام آن کار چه کاری بکند. زمانی که از بلوک‌های try-except استفاده می‌کنید برنامه‌های شما حتی در صورت به اشتباه افتادن به کار خود ادامه می‌دهند. کاربران به جای traceback که ممکن است خواندن آن برای آن‌ها گیج‌کننده باشد، پیام‌هایی مناسب می‌بینند که شما خود نوشته‌اید.

رسیدگی به استثنای ZeroDivisionError

به خطایی ساده که موجب می‌شود اعلام استثنا کند می‌پردازیم. احتمالاً می‌دانید که تقسیم کردن عددی بر صفر ناممکن است، امّا بگذارید از پایتون بخواهیم این کار را انجام دهد:

1
print(5/0)

البته که پایتون نمی‌تواند چنین کاری کند بنابراین به یک traceback برمی‌خوریم:

1
2
3
4
Traceback (most recent call last):
  File "division_calculator.py", line 1, in <module>
    print(5/0)
ZeroDivisionError: division by zero

خطایی که در traceback نشان داده شده، ZeroDivisionError، یک شیء استثنا است. پایتون چنین شیء‌ای را در واکنش به وضعیّتی می‌سازد که در آن نمی‌تواند کاری را که از آن خواسته‌ایم انجام دهد. زمانی که چنین چیزی رخ می‌دهد، پایتون برنامه را متوقّف کرده و به ما می‌گوید چه نوع استثنایی رخ داده است. ما می‌توانیم از این اطّلاعات برای تغییر دادن و اصلاح برنامه‌ی خود استفاده کنیم. به پایتون می‌گوییم زمانی که چنین استثنایی رخ داد چه کاری انجام بده؛ با این کار اگر چنین موقعیّتی دوباره پیش بیاید ما آمادگی داریم.

استفاده از بلوک‌های try-except

زمانی که فکر می‌کنید ممکن است خطایی رخ دهد، می‌توانید یک بلوک try-except بنویسید تا به استثنایی که احتمالاً رخ می‌دهد رسیدگی کنید. از پایتون می‌خواهید که کدی را اجرا کند و به آن می‌گویید در صورتی که اجرای کد به وقوع نوع خاصّی از استثنا انجامید، چه کاری انجام دهد.

اینجا نشان می‌دهیم که بلوک try-except برای رسیدگی به استثنای ZeroDivisionError چه شکلی است:

1
2
3
4
try:
    print(5/0)
except ZeroDivisionError:
    print("You can't divide by zero!")

خطّی را که موجب بروز خطا می‌شود، print(5/0)، در بلوک try قرار می‌دهیم. اگر کد داخل try کار کند، پایتون از روی بلوک except می‌پرد. اگر کد داخل بلوک try منجر به خطا شود، پایتون به دنبال بلوک except‌ای می‌گردد که استثنای آن با استثنای رخ‌داده منطبق باشد و کد داخل آن را اجرا می‌کند.

در این مثال کد داخل try خطای ZeroDivisionError را تولید می‌کند بنابراین پایتون به دنبال بلوک except‌ای می‌گردد که به او بگوید چه باید بکند. پایتون سپس کد داخل آن بلوک را اجرا می‌کند و کاربر به جای traceback یک پیام خطای دوستانه می‌بیند:

1
You can't divide by zero!

اگر پس از بلوک try-except کد دیگری نوشته شده باشد، اجرای برنامه ادامه می‌یابد زیرا به پایتون گفته‌ایم که چگونه خطا را مدیریّت کند.