در این مطلب، چگونگی مدیریت استثنا در پایتون با استفاده از عبارات except ،try و finally آموزش داده شده است. این قابلیت به کاربران امکان نوشتن کدهای تمیز، خوانا و کارا را در پایتون می‌دهد.

مدیریت استثنا در پایتون

پایتون دارای استثناهای توکار متعددی است که در صورتی که چیزی اشتباه باشد، برنامه را مجبور به نمایش خطا می‌کنند. هنگامی که این استثناها به وقوع می‌پیوندند، موجب می‌شوند که فرایند اجرای برنامه متوقف شود و به فراخوانی فرایند تا جایی که مشکل حل شود، ارجاع داده شود. در صورتی که خطاها و استثناها مدیریت نشوند، برنامه با مشکل و خطا مواجه خواهد شد. برای مثال، فرض می‌شود که تابع A، تابع B را فراخوانی می‌کند و تابع B متعاقبا تابع C را فراخوانی می‌کند. اگر یک استثنا در تابع C به وقوع بپیوندد و در C مدیریت نشود، به B و سپس به A پاس داده می‌شود. اگر هیچ وقت مدیریت نشوند، یک پیغام خطا صادر می‌شود و برنامه دچار یک توقف غیر منتظره می‌شود. در ادامه به چگونگی کشف و مدیریت استثنا در پایتون پرداخته شده است.

کشف و مدیریت استثنا در پایتون

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

# import module sys to get the type of exception
import sys

randomList = ['a', 0, 2]

for entry in randomList:
    try:
        print("The entry is", entry)
        r = 1/int(entry)
        break
    except:
        print("Oops!",sys.exc_info()[0],"occured.")
        print("Next entry.")
        print()
print("The reciprocal of",entry,"is",r)

خروجی قطعه کد بالا در ادامه آمده است.

The entry is a
Oops! <class 'ValueError'> occured.
Next entry.

The entry is 0
Oops! <class 'ZeroDivisionError' > occured.
Next entry.

The entry is 2
The reciprocal of 2 is 0.5

در این برنامه، تا هنگامی که کاربر یک عدد صحیح را که دارای تقابل معتبر است وارد نکند، حلقه ادامه پیدا می‌کند. بخشی که منجر به استثنا می‌شود را درون بلوک try قرار می‌دهد. اگر هیچ استثنائی به وقوع نپیوندد، بلوک except رها می‌شود و جریان نرمال ادامه پیدا می‌کند. اما اگر استثنائی به وقوع بپیوندد، توسط بلوک except گرفته (Catch) می‌شود. در اینجا، نام استثنا با استفاده از تابع ()ex_info درون ماژول sys پرینت می‌شود و از کاربر خواسته می‌شود که مجددا تلاش کند. می‌توان مشاهده کرد که مقادیر «a» و «۱٫۳» منجر به خطای ValueError و «0» منجر به ZeroDivisionError می‌شود.

گرفتن استثناهای خاص در پایتون

در مثال بالا، هیچ استثنائی در شرط except مشخص نشده است. این کد، یک کد خوب محسوب نمی‌شود و همه استثناها را گرفته و هر مورد را به شیوه‌ای مشابه مدیریت می‌کند. کاربر می‌تواند تعیین کند که شرط except کدام استثناها را به دام می‌اندازد و در واقع، Catch می‌کند. یک شرط try می‌تواند هر تعداد شرط برای مدیریت کردن آن‌ها به صورت جدا جدا داشته باشد، اما در صورت وقوع استثناها، تنها یکی اجرا می‌شود. می‌توان از «تاپل» (Tuple) مقادیر برای تعیین استثناها در شرط except استفاده کرد.

یک شرط try می‌تواند هر تعداد except برای مدیریت آن‌ها به طور متفاوت داشته باشد، اما فقط در صورت وقوع استثنا یکی از آن‌ها اجرا می‌شود. می‌توان از یک تاپل از مقادیر برای تعیین کردن استثناها در یک شرط except استفاده کرد. در ادامه، شبه کد این مثال، آورده شده است.

try:
   # do something
   pass

except ValueError:
   # handle ValueError exception
   pass

except (TypeError, ZeroDivisionError):
   # handle multiple exceptions
   # TypeError and ZeroDivisionError
   pass

except:
   # handle all other exceptions
   pass

نمایش استثناها در پایتون

در برنامه‌نویسی پایتون، استثناها هنگامی به وقوع می‌پیوندند که خطاهای مرتبط در هنگام اجرا به وقوع بپیوندند؛ اما می‌توان آن را قویا با استفاده از کلیدواژه raise نمایش داد. همچنین، می‌توان به طور دلخواه یک مقدار را به یک استثنا پاس داد تا مشخص شود چرا آن استثنا به وقوع پیوسته است.

>>> raise KeyboardInterrupt
Traceback (most recent call last):
...
KeyboardInterrupt

>>> raise MemoryError("This is an argument")
Traceback (most recent call last):
...
MemoryError: This is an argument

>>> try:
...     a = int(input("Enter a positive integer: "))
...     if a <= 0:
...         raise ValueError("That is not a positive number!")
... except ValueError as ve:
...     print(ve)
...    
Enter a positive integer: -2
That is not a positive number!

try…finally در پایتون

دستور try در پایتون، می‌تواند دارای یک شرط اختیاری finally باشد. این شرط در هر حال اتفاق می‌افتد و به طور کلی برای آزاد کردن منابع اضافی مورد استفاده قرار می‌گیرد. برای مثال، کاربر ممکن است به یک «مرکز داده» (Data Center) از راه دور (Remote Data Center) از طریق شبکه یا کار کردن با رابط کاربری گرافیکی (Graphical User Interface | GUI) متصل شده باشد. در کلیه شرایط، باید منابعی که یک‌بار استفاده شده‌اند را چه عملیات موفق بوده باشد و چه نباشد، پاک کرد. این اقدامات (بستن یک فایل یا قطع کردن اتصال از شبکه) در شرط نهایی به وقوع می‌پیوندند تا استثنا را تضمین کنند. در ادامه، مثالی از عملیات فایل برای نمایش دادن این مورد، ارائه شده است.

try:
   f = open("test.txt",encoding = 'utf-8')
   # perform file operations
finally:
   f.close()

این نوع از ساخت، این اطمینان را فراهم می‌کند که فایل بسته شده است، حتی اگر استثنائی به وقوع بپیوندد.

اگر این مطلب برای شما مفید بوده است، آموزش‌ها و مطالب زیر نیز به شما پیشنهاد می‌شوند:

بر اساس رای ۲ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«الهام حصارکی»، فارغ‌التحصیل مقطع کارشناسی ارشد مهندسی فناوری اطلاعات، گرایش سیستم‌های اطلاعات مدیریت است. او در زمینه هوش مصنوعی و داده‌کاوی، به ویژه تحلیل شبکه‌های اجتماعی، فعالیت می‌کند.