آموزش پایتون - استثناهای توکار
استثناهای توکار (Built-in exceptions) کلاسهای خطای پیشفرض در پایتون هستند که خطاها و شرایط استثنایی را در برنامهها مدیریت میکنند. این استثناها از کلاس پایه "BaseException" مشتق شدهاند و بخشی از کتابخانه استاندارد محسوب میشوند.
استثناهای توکار استاندارد در پایتون
در ادامه لیستی از استثناهای استاندارد موجود در پایتون آورده شده است −
| شماره | نام استثنا و توضیحات |
|---|---|
| 1 |
Exception کلاس پایه برای تمامی استثناها |
| 2 |
StopIteration هنگامی رخ میدهد که متد ()next یک پیمایشگر (iterator) به هیچ شیئی اشاره نکند. |
| 3 |
SystemExit توسط تابع ()sys.exit فراخوانی میشود. |
| 4 |
StandardError کلاس پایه برای تمامی استثناهای توکار به جز StopIteration و SystemExit. |
| 5 |
ArithmeticError کلاس پایه برای تمامی خطاهایی که در محاسبات عددی رخ میدهند. |
| 6 |
OverflowError هنگامی رخ میدهد که یک محاسبه از حداکثر حد مجاز برای یک نوع عددی فراتر رود. |
| 7 |
FloatingPointError هنگامی رخ میدهد که محاسبه اعداد ممیز شناور با شکست مواجه شود. |
| 8 |
ZeroDivisonError هنگامی رخ میدهد که تقسیم یا باقیمانده تقسیم بر صفر برای انواع عددی انجام شود. |
| 9 |
AssertionError در صورت شکست دستور Assert رخ میدهد. |
| 10 |
AttributeError در صورت عدم موفقیت در ارجاع به یک ویژگی (attribute) یا مقداردهی آن رخ میدهد. |
| 11 |
EOFError هنگامی رخ میدهد که هیچ ورودی از توابع ()raw_input یا ()input دریافت نشود و به پایان فایل برسیم. |
| 12 |
ImportError هنگامی رخ میدهد که دستور import با شکست مواجه شود. |
| 13 |
KeyboardInterrupt هنگامی رخ میدهد که کاربر اجرای برنامه را قطع کند، معمولاً با فشردن Ctrl+C. |
| 14 |
LookupError کلاس پایه برای تمامی خطاهای جستجو (lookup). |
| 15 |
IndexError هنگامی رخ میدهد که یک اندیس در یک دنباله یافت نشود. |
| 16 |
KeyError هنگامی رخ میدهد که کلید مشخصشده در دیکشنری پیدا نشود. |
| 17 |
NameError هنگامی رخ میدهد که یک شناسه در فضای نام محلی یا سراسری یافت نشود. |
| 18 |
UnboundLocalError هنگامی رخ میدهد که سعی شود به یک متغیر محلی در یک تابع یا متد دسترسی پیدا شود، اما هیچ مقداری به آن اختصاص داده نشده باشد. |
| 19 |
EnvironmentError کلاس پایه برای تمامی استثناهایی که خارج از محیط پایتون رخ میدهند. |
| 20 |
IOError هنگامی رخ میدهد که یک عملیات ورودی/خروجی با شکست مواجه شود، مانند دستور print یا تابع ()open هنگام تلاش برای باز کردن فایلی که وجود ندارد. |
| 21 |
OSError برای خطاهای مربوط به سیستمعامل رخ میدهد. |
| 22 |
SyntaxError هنگامی رخ میدهد که خطایی در ساختار و نحو (syntax) پایتون وجود داشته باشد. |
| 23 |
IndentationError هنگامی رخ میدهد که تورفتگیها (indentation) به درستی مشخص نشده باشند. |
| 24 |
SystemError هنگامی رخ میدهد که مفسر یک مشکل داخلی پیدا کند، اما با مواجهه با این خطا مفسر پایتون خارج نمیشود. |
| 25 |
SystemExit هنگامی رخ میدهد که مفسر پایتون با استفاده از تابع ()sys.exit بسته شود. اگر در کد مدیریت نشود، باعث خروج از مفسر میشود. |
| 26 |
TypeError هنگامی رخ میدهد که یک عملیات یا تابع روی نوع دادهای انجام شود که برای آن نامعتبر است. |
| 27 |
ValueError هنگامی رخ میدهد که یک تابع توکار نوع آرگومانهای معتبری را دریافت کند، اما مقادیر نامعتبری برای آن آرگومانها مشخص شده باشد. |
| 28 |
RuntimeError هنگامی رخ میدهد که خطای ایجادشده در هیچ دستهبندی دیگری قرار نگیرد. |
| 29 |
NotImplementedError هنگامی رخ میدهد که یک متد انتزاعی که باید در یک کلاس ارثبریشده پیادهسازی شود، در عمل پیادهسازی نشده باشد. |
در ادامه چند نمونه از استثناهای استاندارد آورده شده است −
IndexError
این خطا هنگام تلاش برای دسترسی به متغیری در اندیس نامعتبر نمایش داده میشود.
numbers=[10,20,30,40]
for n in range(5):
print (numbers[n])
خروجی زیر را تولید خواهد کرد خروجی −
10
20
30
40
Traceback (most recent call last):
print (numbers[n])
IndexError: list index out of range
ModuleNotFoundError
این خطا زمانی نمایش داده میشود که ماژول پیدا نشود.
import notamodule
Traceback (most recent call last):
import notamodule
ModuleNotFoundError: No module named 'notamodule'
KeyError
این خطا زمانی رخ میدهد که کلید دیکشنری یافت نشود.
D1={'1':"aa", '2':"bb", '3':"cc"}
print ( D1['4'])
Traceback (most recent call last):
D1['4']
KeyError: '4'
ImportError
این خطا زمانی نمایش داده میشود که تابع مشخصشده برای وارد کردن (import) در دسترس نباشد.
from math import cube
Traceback (most recent call last):
from math import cube
ImportError: cannot import name 'cube'
StopIteration
این خطا زمانی ظاهر میشود که تابع ()next پس از به پایان رسیدن جریان پیمایشگر (iterator) فراخوانی شود.
.it=iter([1,2,3])
next(it)
next(it)
next(it)
next(it)
Traceback (most recent call last):
next(it)
StopIteration
TypeError
این خطا زمانی نمایش داده میشود که یک عملگر یا تابع روی شیئی از نوع نامناسب اعمال شود.
print ('2'+2)
Traceback (most recent call last):
'2'+2
TypeError: must be str, not int
ValueError
این خطا زمانی نمایش داده میشود که آرگومان تابع از نوع نامناسبی باشد.
print (int('xyz'))
Traceback (most recent call last):
int('xyz')
ValueError: invalid literal for int() with base 10: 'xyz'
NameError
این خطا زمانی رخ میدهد که شیء مورد نظر یافت نشود.
print (age)
Traceback (most recent call last):
age
NameError: name 'age' is not defined
ZeroDivisionError
این خطا زمانی نمایش داده میشود که عملوند دوم در تقسیم برابر با صفر باشد.
x=100/0
Traceback (most recent call last):
x=100/0
ZeroDivisionError: division by zero
KeyboardInterrupt
زمانی که کاربر در حین اجرای برنامه کلید وقفه (معمولاً Control-C) را فشار میدهد.
name=input('enter your name')
enter your name^c
Traceback (most recent call last):
name=input('enter your name')
KeyboardInterrupt
سلسلهمراتب استثناهای توکار
استثناها در پایتون در یک ساختار سلسلهمراتبی سازماندهی شدهاند که "BaseException" در رأس آن قرار دارد. در ادامه یک سلسلهمراتب سادهشده آورده شده است −
- BaseException
- SystemExit
- KeyboardInterrupt
- Exception
- ArithmeticError
- FloatingPointError
- OverflowError
- ZeroDivisionError
- AttributeError
- EOFError
- ImportError
- LookupError
- IndexError
- KeyError
- MemoryError
- NameError
- UnboundLocalError
- OSError
- FileNotFoundError
- TypeError
- ValueError
- ---(بسیاری از موارد دیگر)---
- ArithmeticError
نحوه استفاده از استثناهای توکار
همانطور که میدانیم، استثناهای توکار در پایتون کلاسهای از پیش تعریفشدهای هستند که شرایط خطای خاص را مدیریت میکنند. در ادامه راهنمای مفصلی درباره نحوه استفاده موثر از آنها در برنامههای پایتون آورده شده است −
مدیریت استثناها با بلوکهای try-except
روش اصلی مدیریت استثناها در پایتون استفاده از بلوکهای "try-except" است. این کار به شما امکان میدهد استثناهایی را که ممکن است در طول اجرای کد رخ دهند، دریافت کرده و به آنها پاسخ دهید.
مثال
در مثال زیر، کدی که ممکن است استثنا ایجاد کند داخل بلوک "try" قرار گرفته است. بلوک "except" استثنای مشخصشده یعنی "ZeroDivisionError" را دریافت کرده و آن را مدیریت میکند
try:
result = 1 / 0
except ZeroDivisionError as e:
print(f"Caught an exception: {e}")
خروجی بهدستآمده به شرح زیر است −
Caught an exception: division by zero
مدیریت چند استثنا
شما میتوانید با مشخص کردن چند استثنا در یک تاپل داخل بلوک "except"، آنها را مدیریت کنید، همانطور که در مثال زیر نشان داده شده است −
try:
result = int('abc')
except (ValueError, TypeError) as e:
print(f"Caught a ValueError or TypeError: {e}")
خروجی کد بالا به صورت زیر است −
Caught a ValueError or TypeError: invalid literal for int() with base 10: 'abc'
استفاده از بلوکهای "else" و "finally"
بلوک "else" زمانی اجرا میشود که کد موجود در عبارات بلوک "try" هیچ استثنایی ایجاد نکند −
try:
number = int(input("Enter a number: "))
except ValueError as e:
print(f"Invalid input: {e}")
else:
print(f"You entered: {number}")
خروجی کد بالا بر اساس ورودی دادهشده متفاوت خواهد بود −
Enter a number: bn
Invalid input: invalid literal for int() with base 10: 'bn'
بلوک "finally" همیشه اجرا میشود، صرفنظر از اینکه استثنایی رخ داده باشد یا خیر. این بلوک معمولاً برای عملیات پاکسازی، مانند بستن فایلها یا آزادسازی منابع استفاده میشود −
try:
file = open('example.txt', 'r')
content = file.read()
except FileNotFoundError as e:
print(f"File not found: {e}")
finally:
file.close()
print("File closed.")
خروجی کد بالا به شرح زیر است −
File closed.
فراخوانی صریح استثناهای توکار
در پایتون، میتوانید استثناهای توکار را بهصورت صریح فراخوانی کنید (raise) تا نشاندهنده خطاها یا شرایط استثنایی در کد شما باشند. این کار به شما امکان میدهد سناریوهای خطای خاص را مدیریت کرده و پیامهای خطای آگاهیبخشی را به کاربران یا توسعهدهندگانی که در حال دیباگ برنامه هستند ارائه دهید.
سنتکس (Syntax)
سنتکس پایه برای فراخوانی استثناهای توکار به شرح زیر است −
raise ExceptionClassName("Error message")
مثال
در این مثال، تابع "divide" تلاش میکند دو عدد "a" و "b" را بر هم تقسیم کند. اگر "b" صفر باشد، یک استثنای "ZeroDivisionError" را همراه با یک پیام سفارشی ایجاد میکند −
def divide(a, b):
if b == 0:
raise ZeroDivisionError("Cannot divide by zero")
return a / b
try:
result = divide(10, 0)
except ZeroDivisionError as e:
print(f"Error: {e}")
خروجی بهدستآمده به صورت زیر است −
Error: Cannot divide by zero
پیشرفت مطالعه: وضعیت خواندهشدن این درس فقط در همین مرورگر ذخیره میشود؛ بدون نیاز به حساب کاربری.