در بسیاری از موارد هنگام برنامه نویسی در زبان پایتون، نیاز داریم قسمتی از برنامه را خطایابی کنیم. برای خطایابی در پایتون از دستور try استفاده میشود. با استفاده از دستورات try except در پایتون میتوان به راحتی این کار را انجام داد. در این قسمت از دوره رایگان آموزش پایتون فنولوژی، به مبحث خطایابی در پایتون با دستورات try except میپردازیم. با ما همراه باشید.
بلوک Try Except در پایتون
در این قسمت به طور مختصر در مورد کارایی سینتکسهای مورد استفاده توضیح دادهایم:
- بلوک try به شما اجازه میدهد که قطعهای از کد را برای خطایابی اجرا کنید.
- بلوک except امکان رسیدگی به این خطا را برای شما فراهم میآورد. (اگر دستورات try خطا داشتند، دستورات except اجرا میشود.)
- بلوک finally به شما این امکان را میدهد که کد را مستقل از نتیجه بلوکهای try-except اجرا نمایید.
بررسی و رسیدگی به خطا/استثناء (Exception Handling)
در موارد عادی، هنگامی که خطا در اجرای کد رخ میدهد، پایتون اجرای باقی برنامه را متوقف کرده و پیام خطایی را چاپ میکند. حال اگر بخواهیم خطای معمول پایتون نمایش داده نشود، به برنامه میگوییم فلان دستور را اجرا کن (try) و اگر خطا داد، استثنا (exception) قائل شو و به جای خطای معمول پایتون، دستورات موجود در بخش except را اجرا کن.
مثال: در این مثال متغیر x را تعریف نکردهایم. از برنامه میخواهیم در صورت بروز خطا عبارت داخل پرینت را چاپ کند.
1 2 3 4 |
try: print(x) except: print("An exception occurred") |
خروجی:
1 |
An exception occurred |
از آنجایی که بلوک آزمون (try) هشدار وجود خطایی را اعلام مینماید، بلوک موارد استثنائی (except) اجرا خواهد شد. به عبارتی، مفسر پایتون ابتدا تلاش میکند تا کد داخل بلوک آزمون را اجرا کند و در صورتی که حین اجرای آن با خطایی مواجه شود، به کد داخل بلوک استثنائات مراجعه مینماید.
بدون حضور try except در پایتون اجرای برنامه با چاپ خطای زیر متوقف میشد. با استفاده از try except توانستیم نوع خطا را تغییر دهیم و از اتمام برنامه جلوگیری کنیم.
1 2 3 4 |
Traceback (most recent call last): File "demo_try_except_error.py", line 3, in <module> print(x) NameError: name 'x' is not defined |
خطایابی در پایتون با استفاده از چند except
شما میتوانید به هر تعداد که مایلید بلوکهای except برای خطاهای متفاوت تعریف کنید. برای مثال، میتوانید در صورت روی دادن نوع خاصی از خطا، کد بهخصوصی را اجرا نمایید.
مثال: در صورت وجود خطای NameError یک پیام را چاپ کن و برای باقی خطاها، پیامی دیگر.
1 2 3 4 5 6 |
try: print(x) except NameError: print("Variable x is not defined") except: print("Something else went wrong") |
خروجی:
1 |
Variable x is not defined |
بلوک Else و خطایابی در پایتون
در دستورات شرطی در پایتون از کلیدواژهی else استفاده میشود. شما میتوانید با استفاده از کلیدواژهی else، تعریف کنید که در صورت عدم وجود خطا در بلوک try، مجموعه دستوراتی اجرا شود.
مثال: در این مثال، عبارت داخل try هشداری برای وجود خطا نمیدهد.
1 2 3 4 5 6 |
try: print("Hello") except: print("Something went wrong") else: print("Nothing went wrong") |
خروجی:
1 2 |
Hello Nothing went wrong |
بلوک Finally
بلوک finally، در صورت تعریف شدن، مستقل از اینکه بلوک try هشدار وجود خطایی بدهد یا خیر، اجرا خواهد شد.
مثال: چه دستور داخل try خطا بدهد چه ندهد، عبارت داخل پرینت finally را چاپ کن.
1 2 3 4 5 6 |
try: print(x) except: print("Something went wrong") finally: print("The 'try except' is finished") |
خروجی:
1 2 |
Something went wrong The 'try except' is finished |
این قابلیت میتواند برای بستن فایلها و مدیریت منابع مفید واقع شود.
مثال: فایلی را باز کنید که قابلیت نوشتن ندارد، و سعی کنید درون آن چیزی بنویسید.
1 2 3 4 5 6 7 |
try: f = open("demofile.txt") f.write("Lorem Ipsum") except: print("Something went wrong when writing to the file") finally: f.close() |
برنامه میتواند به اجرای خود ادامه دهد، بدون اینکه فایل را باز نگه دارد.
ساخت دستی خطا در پایتون
به عنوان یک برنامهنویس پایتون این امکان را دارید که به انتخاب خودتان در صورت برقرار بودن شرطی خاص، خطایی را فعال کنید. برای این کار کافیست از دستور raise استفاده کنید.
مثال: هشدار وجود خطا را در صورتی فعال و اجرای برنامه را متوقف کن که متغیر x کوچکتر از ۰ باشد.
1 2 3 4 |
x = -1 if x < 0: raise Exception("Sorry, no numbers below zero") |
خروجی:
1 2 3 4 |
Traceback (most recent call last): File "demo_ref_keyword_raise.py", line 4, in <module> raise Exception("Sorry, no numbers below zero") Exception: Sorry, no numbers below zero |
نکته: در این حالت مانند سایر خطاها برنامه متوقف میشود.
از کلمه کلیدی raise برای اعلام وجود خطا استفاده میشود، در نتیجه میتوانید نوع خطا و پیام مختص به آن خطا را نیز خودتان مشخص کنید.
مثال: در صورتی که x یک عدد صحیح (integer) نبود هشدار TypeError را فعال کن و پیام مد نظر را چاپ کن.
1 2 3 4 |
x = "hello" if not type(x) is int: raise TypeError("Only integers are allowed") |
1 2 3 4 |
Traceback (most recent call last): File "demo_ref_keyword_raise2.py", line 4, in <module> raise TypeError("Only integers are allowed") TypeError: Only integers are allowed |