آموزش پایتون - استثناهای توکار

استثناهای توکار (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
    • ---(بسیاری از موارد دیگر)---

نحوه استفاده از استثناهای توکار

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

مدیریت استثناها با بلوک‌های 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

پیشرفت مطالعه: وضعیت خوانده‌شدن این درس فقط در همین مرورگر ذخیره می‌شود؛ بدون نیاز به حساب کاربری.