مدیریت استثنا در پایتون — به زبان ساده

۹۶۹ بازدید
آخرین به‌روزرسانی: ۲۰ اردیبهشت ۱۴۰۲
زمان مطالعه: ۳ دقیقه
مدیریت استثنا در پایتون — به زبان ساده

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

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

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

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

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

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

در ادامه، مثال ساده‌ای از این مورد آورده شده است.

1# import module sys to get the type of exception
2import sys
3
4randomList = ['a', 0, 2]
5
6for entry in randomList:
7    try:
8        print("The entry is", entry)
9        r = 1/int(entry)
10        break
11    except:
12        print("Oops!",sys.exc_info()[0],"occured.")
13        print("Next entry.")
14        print()
15print("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 استفاده کرد. در ادامه، شبه کد این مثال، آورده شده است.

1try:
2   # do something
3   pass
4
5except ValueError:
6   # handle ValueError exception
7   pass
8
9except (TypeError, ZeroDivisionError):
10   # handle multiple exceptions
11   # TypeError and ZeroDivisionError
12   pass
13
14except:
15   # handle all other exceptions
16   pass

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

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

همچنین، می‌توان به طور دلخواه یک مقدار را به یک استثنا پاس داد تا مشخص شود چرا آن استثنا به وقوع پیوسته است.

1>>> raise KeyboardInterrupt
2Traceback (most recent call last):
3...
4KeyboardInterrupt
5
6>>> raise MemoryError("This is an argument")
7Traceback (most recent call last):
8...
9MemoryError: This is an argument
10
11>>> try:
12...     a = int(input("Enter a positive integer: "))
13...     if a <= 0:
14...         raise ValueError("That is not a positive number!")
15... except ValueError as ve:
16...     print(ve)
17...    
18Enter a positive integer: -2
19That is not a positive number!

try...finally در پایتون

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

در ادامه، مثالی از عملیات فایل برای نمایش دادن این مورد، ارائه شده است.

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

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

بر اساس رای ۶ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
Programiz
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *