در پایتون، خطاها معمولاً به دو دستهی اصلی تقسیم میشوند:
الف) خطاهای نحوی (Syntax Errors)
این خطاها به دلیل نقض قواعد نحوی پایتون رخ میدهند. این نوع خطاها در زمان اجرای برنامه قابل مدیریت نیستند و باید قبل از اجرای برنامه تصحیح شوند.
مثال:
print('Hello World' # پرانتز بسته نشده است
خروجی:
SyntaxError: unexpected EOF while parsing
ب) استثناها (Exceptions)
استثناها خطاهایی هستند که در زمان اجرا (Runtime) رخ میدهند. برخی از مهمترین آنها عبارتند از:
| نوع خطا | توضیح |
|---|---|
TypeError | زمانی رخ میدهد که یک عملیات روی نوع داده نامناسب انجام شود. |
ValueError | زمانی که مقدار ورودی معتبر نباشد. |
IndexError | وقتی به اندیسی خارج از محدودهی لیست یا تاپل دسترسی پیدا کنیم. |
KeyError | زمانی که کلید مورد نظر در دیکشنری وجود نداشته باشد. |
ZeroDivisionError | وقتی عددی را بر صفر تقسیم کنیم. |
FileNotFoundError | زمانی که فایل مورد نظر وجود نداشته باشد. |
ImportError | وقتی یک ماژول وجود ندارد یا قابل بارگذاری نیست. |
مثال:
x = 5 + '10' # TypeError رخ میدهد
خروجی:
TypeError: unsupported operand type(s) for +: 'int' and 'str'
try-exceptدر پایتون میتوانیم از بلوک try-except برای مدیریت خطاها استفاده کنیم. کدهایی که ممکن است باعث خطا شوند درون try قرار میگیرند و در صورت وقوع خطا، except اجرا میشود.
مثال:
try:num = int(input('یک عدد وارد کنید: '))print(f'عدد شما: {num}')except ValueError:print('خطا: لطفاً یک عدد صحیح وارد کنید!')
نمونه ورودی و خروجی:
یک عدد وارد کنید: abc
خطا: لطفاً یک عدد صحیح وارد کنید!
مدیریت چندین استثنا
میتوان چندین نوع خطا را بهطور همزمان مدیریت کرد:
try:num = int(input('یک عدد وارد کنید: '))result = 10 / numprint(result)except ValueError:print('خطا: مقدار ورودی عدد صحیح نیست!')except ZeroDivisionError:print('خطا: تقسیم بر صفر مجاز نیست!')
finally و raiseالف) finally
بخش finally همیشه اجرا میشود، چه خطایی رخ دهد و چه ندهد. این ویژگی برای بستن فایلها، آزاد کردن منابع و اجرای کدهای ضروری کاربرد دارد.
مثال:
try:file = open('data.txt', 'r')content = file.read()except FileNotFoundError:print('فایل یافت نشد!')finally:print('اجرای بلوک finally')if 'file' in locals():file.close()
ب) raise
از raise برای ایجاد استثناهای سفارشی یا گزارش خطاها بهصورت دستی استفاده میشود.
مثال:
def تقسیم(a, b):if b == 0:raise ZeroDivisionError('تقسیم بر صفر امکانپذیر نیست!')return a / btry:print(تقسیم(10, 0))except ZeroDivisionError as e:print(f'خطا: {e}')
خروجی:
خطا: تقسیم بر صفر امکانپذیر نیست!
در برخی موارد ممکن است بخواهیم استثناهای خاص خود را تعریف کنیم. برای این کار، یک کلاس از Exception ارثبری میکنیم.
مثال:
class NegativeNumberError(Exception):"""خطای مربوط به ورودی عدد منفی"""def __init__(self, value):super().__init__(f'مقدار {value} عدد منفی است که مجاز نیست!')def جذر(x):if x < 0:raise NegativeNumberError(x)return x ** 0.5try:print(جذر(-9))except NegativeNumberError as e:print(f'خطا: {e}')
خروجی:
خطا: مقدار -9 عدد منفی است که مجاز نیست!
try-except میتوان خطاها را مدیریت کرد.finally برای اجرای کدهای ضروری در هر شرایطی مفید است.raise برای ایجاد خطاهای سفارشی به کار میرود.Exception، استثناهای مخصوص خود را طراحی کنیم.با این روشها، برنامههای ما پایدارتر و حرفهایتر خواهند بود! 🚀