مدیریت خطا در پایتون «Error handling in Python» یکی از ویژگیهای مهم است که به برنامهنویسان این امکان را میدهد که بهطور مؤثر با خطاها و استثناها برخورد کنند. برای مدیریت خطا در پایتون از بلوکهای try و except استفاده میشود. زمانی که در داخل بلوک try خطایی رخ میدهد، اجرای برنامه متوقف میشود و بهطور خودکار به بلوک except منتقل میشود. این امر باعث میشود که برنامه بدون کرش کردن و با مدیریت مناسب خطاها به اجرای خود ادامه دهد. همچنین، میتوان در بلوکهای except پیغامهای خطا را چاپ کرد یا اقدامات خاصی را برای مدیریت خطا انجام داد. این روش از بروز مشکلات عمده در هنگام اجرای برنامه جلوگیری میکند و به افزایش پایداری آن کمک میکند.
مقدمه
مدیریت خطا در پایتون یکی از ویژگیهای کلیدی این زبان است که به برنامهنویسان کمک میکند تا از وقوع خطاهای ناخواسته در زمان اجرا جلوگیری کنند و رفتار مناسب را برای مواجهه با آنها تعریف کنند. مدیریت خطا در پایتون با استفاده از ساختارهای try , except , else و finally انجام میشود. این ساختارها به شما این امکان را میدهند که کدهایی را که ممکن است باعث ایجاد خطا شوند، شناسایی کرده و واکنش مناسب برای حل یا ثبت خطا را ارائه دهید. این قابلیت باعث میشود برنامهها پایدارتر شوند و تجربه کاربری بهتری ارائه دهند، زیرا به جای توقف ناگهانی برنامه، خطاها مدیریت شده و پیامهای مناسب به کاربران نمایش داده میشوند.
try: # Code that may raise an exception x = 3 / 0 print(x) except: # exception occurs, if code under try throws error print("An exception occurred.")
خروجی:
An exception occurred.
Try و Except در پایتون
عبارتهای try و except برای مدیریت خطاها در کد استفاده میشوند. بلوک try برای بررسی کدی به کار میرود که ممکن است خطا داشته باشد. یعنی اگر کدی که در بلوک try قرار دارد بدون خطا اجرا شود، برنامه به درستی ادامه مییابد. اما اگر در بلوک try خطایی رخ دهد، برنامه به بلوک except میرود و کدی که در این بلوک قرار دارد اجرا میشود.
نحو یا Syntax:
try: # Some Code except: # Executed if error in the # try block
نحوه کار try در پایتون
- ابتدا کدی که درون بلوک try قرار دارد، اجرا میشود.
- اگر هیچ استثنایی (خطا) رخ ندهد، فقط بلوک try اجرا میشود و بلوک except نادیده گرفته میشود.
- اگر استثنایی رخ دهد، اجرای بلوک try متوقف میشود و به بلوک except میرود.
- اگر استثنا رخ دهد اما بلوک except آن را مدیریت نکند، این استثنا به بلوکهای try خارجیتر منتقل میشود. اگر استثنا در نهایت مدیریت نشود، اجرای برنامه متوقف میشود.
- یک عبارت try میتواند بیش از یک بلوک except داشته باشد تا انواع مختلف خطاها را مدیریت کند.
برخی از خطاهای استثنا رایج عبارتند از:
- IOError: زمانی که فایل قابل باز شدن نباشد.
- eyboardInterrupt: زمانی که کاربر یک کلید ناخواسته را فشار دهد.
- ValueError: زمانی که یک تابع داخلی آرگومان نادرستی دریافت کند.
- OFError: زمانی که به انتهای فایل «End-Of-File» برسیم بدون اینکه دادهای خوانده شود.
- ImportError: زمانی که ماژول موردنظر پیدا نشود.
مثال۱: بدون استثنا، بنابراین بلوک try اجرا میشود.
# Python code to illustrate # working of try() def divide(x, y): try: # Floor Division : Gives only Fractional Part as Answer result = x // y print("Yeah ! Your answer is :", result) except ZeroDivisionError: print("Sorry ! You are dividing by zero ") # Look at parameters and note the working of Program divide(3, 2)
خروجی:
Yeah ! Your answer is : 1
در این مثال، چون هیچ استثنایی رخ نمیدهد، پیام «This is inside the try block» در ابتدا چاپ شده و سپس پیام «No exception occurred. The try block ran successfully» نیز نمایش داده میشود.
مثال۲: یک استثنا وجود دارد، بنابراین فقط بلوک except اجرا میشود.
# Python code to illustrate # working of try() def divide(x, y): try: # Floor Division : Gives only Fractional Part as Answer result = x // y print("Yeah ! Your answer is :", result) except ZeroDivisionError: print("Sorry ! You are dividing by zero ") # Look at parameters and note the working of Program divide(3, 0)
خروجی:
Sorry ! You are dividing by zero
در این مثال، چون تقسیم بر صفر انجام میشود، استثنای ZeroDivisionError رخ میدهد و پیام «An error occurred: division by zero» نمایش داده میشود. بلوک else اجرا نخواهد شد.
مثال۳: روش دیگر نوشتن عبارت except، که فقط استثناهایی را که قصد دارید آنها را بگیرید، قبول میکند یا میتوانید بررسی کنید که کدام خطا رخ داده است.
# code def divide(x, y): try: # Floor Division : Gives only Fractional Part as Answer result = x // y print("Yeah ! Your answer is :", result) except Exception as e: # By this way we can know about the type of error occurring print("The error is: ",e) divide(3, "GFG") divide(3,0)
خروجی:
The error is: unsupported operand type(s) for //: 'int' and 'str' The error is: integer division or modulo by zero
در این مثال، چون فایل وجود ندارد، استثنای FileNotFoundError رخ میدهد و پیام «The file does not exist» چاپ میشود. اگر خطای دیگری غیر از این رخ میداد، بلوک except Exception اجرا میشد.
عبارت Else در پایتون
عبارت Else در پایتون، در بلوک try-except به شما این امکان را میدهد که کدی را بنویسید که فقط در صورتی اجرا شود که هیچ استثنایی در بلوک try رخ ندهد. به عبارت دیگر، اگر هیچ خطایی در بلوک try ایجاد نشود، بلوک else اجرا میشود. این ویژگی به ویژه زمانی مفید است که بخواهید عملیات خاصی را تنها در صورتی که هیچ خطا پیش نیاید، انجام دهید. بلوک else باید بعد از تمام بلوکهای except قرار گیرد و معمولاً برای انجام کارهایی استفاده میشود که پس از اجرای موفقیتآمیز عملیات اولیه (بدون خطا) نیاز به انجام آنها دارید.
نحو یا سینتکس:
try: # Some Code except: # Executed if error in the # try block else: # execute if no exception
مثال:
# Program to depict else clause with try-except # Function which returns a/b def AbyB(a , b): try: c = ((a+b) // (a-b)) except ZeroDivisionError: print ("a/b result in 0") else: print (c) # Driver program to test above function AbyB(2.0, 3.0) AbyB(3.0, 3.0)
خروجی:
-۵.۰ a/b result in 0
کلمه کلیدی Finally در پایتون
پایتون کلمه کلیدی finally را برای اطمینان از اجرای کدی بعد از بلوکهای try و except فراهم کرده است. بلوک finally همیشه اجرا میشود، چه خطا در بلوک try رخ دهد و چه ندهد. این ویژگی باعث میشود که شما بتوانید کارهایی را که نیاز به انجام آنها دارید، مانند آزادسازی منابع سیستم یا بستن فایلها، پس از انجام عملیات اصلی برنامه انجام دهید. به عبارت دیگر، بلوک finally تضمین میکند که حتی اگر در بلوک try خطایی رخ دهد و پردازش به بلوک except منتقل شود، عملیات ضروری در finally اجرا خواهد شد. این امر به جلوگیری از نشت منابع و بهبود کارایی و پایداری برنامه کمک میکند.
نحو یا سینتکس:
try: # Some Code except: # Executed if error in the # try block else: # execute if no exception finally: # Some code .....(always executed)
# Python program to demonstrate finally # No exception Exception raised in try block try: k = 5//0 # raises divide by zero exception. print(k) # handles zerodivision exception except ZeroDivisionError: print("Can't divide by zero") finally: # this block is always executed # regardless of exception generation. print('This is always executed')
خروجی:
Can't divide by zero This is always executed
نتیجه گیری
پایتون ابزارهای قدرتمندی برای شناسایی و مدیریت خطا در پایتون را در زمان اجرا فراهم میآورد. استفاده از ساختارهای try, except, else, و finally به برنامهنویسان این امکان را میدهد که بهطور موثر با خطاهای احتمالی برخورد کنند و از توقف ناگهانی برنامه جلوگیری کنند. این ویژگیها به بهبود پایداری و قابلیت اعتماد برنامه کمک میکنند و به جای نمایش پیامهای خطای پیچیده به کاربران، امکان ارائه پیامهای مفهومی و کاربرپسند را فراهم میآورد. در نهایت، مدیریت خطا در پایتون به برنامهنویسان این امکان را میدهد که برنامههای مقاومتر و قابل نگهداریتری ایجاد کنند.