مدیریت استثناها در برنامه نویسی پایتون

4 سال پیش
مدیریت استثناها در برنامه نویسی پایتون

مدیریت استثناها در برنامه نویسی پایتون

در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، شما مدیریت استثناها در برنامه نویسی پایتون را می آموزید. که چگونه با استفاده از دستورات try, except and finally، با استفاده از مثالها، موارد استثنایی را در برنامه پایتون مدیریت کنید.

پیشنهاد ویژه : پکیج آموزش پایتون مختص بازار کار

 

موارد استثنا در پایتون

پایتون استثناهای توکار زیادی دارد که وقتی برنامه شما با خطایی روبرو می شود، به وقوع می پیوندند.

وقتی این استثنائات اتفاق می افتد، مفسر پایتون روند فعلی را متوقف می کند و آن را به فرآیند فراخوانی منتقل می کند تا زمانی که رسیدگی شود. اگر به کار اتفاق نیفتد، برنامه خراب می شود.

به عنوان مثال، برنامه ای را در نظر بگیریم كه در آن تابع A وجود دارد كه تابع B را فراخوانی می كند، كه به نوبه خود تابع C را فراخوانی می كند. اگر یک استثنا در تابع C رخ دهد اما در C مدیریت نشود، استثنا به B و سپس به A می رسد.

در صورت عدم مدیریت استثنا، پیام خطایی نمایش داده می شود و برنامه ما به طور ناگهانی متوقف می شود.

 

مدیریت استثناها در پایتون

در پایتون با استفاده از یک گزاره try می توان موارد استثنا را کنترل کرد.

عملیاتی که می تواند یک استثنا را ایجاد کند، در داخل بند  try قرار می گیرد. کدی که موارد استثنا را کنترل می کند در بند except نوشته شده است.

بنابراین ما می توانیم انتخاب کنیم که چه عملیاتی را انجام دهیم تا یک استثنا را مدیریت کنیم. در اینجا یک مثال ساده آورده شده است.

# import module sys to get the type of exception
import sys

randomList = ['a', 0, 2]

for entry in randomList:
    try:
        print("The entry is", entry)
        r = 1/int(entry)
        break
    except:
        print("Oops!", sys.exc_info()[0], "occurred.")
        print("Next entry.")
        print()
print("The reciprocal of", entry, "is", r)

 

خروجی

The entry is a
Oops! <class 'ValueError'> occurred.
Next entry.

The entry is 0
Oops! <class 'ZeroDivisionError'> occured.
Next entry.

The entry is 2
The reciprocal of 2 is 0.5

 

در این برنامه، مقادیر لیست randomList را در یک حلقه قرار می دهیم. همانطور که قبلا ذکر شد، بخشی که می تواند باعث استثنا شود در داخل بلوک try قرار می گیرد.

اگر هیچ استثنایی رخ ندهد، بلوک except حذف شده و جریان عادی ادامه می یابد (برای آخرین مقدار). اما اگر استثنایی رخ دهد، توسط بلوک except (مقادیر اول و دوم) گیر می افتد.

در اینجا، ما نام استثنا را با استفاده از تابع ()exc_info درون ماژول sys چاپ می کنیم. می توانیم ببینیم که a باعث ایجاد ValueError و ۰ باعث ZeroDivisionError می شود.

از آنجا که هر استثنا در پایتون از کلاس پایه استثنا (Exception) به ارث می رسد، ما می توانیم وظیفه فوق را به روش زیر انجام دهیم:

# import module sys to get the type of exception
import sys

randomList = ['a', 0, 2]

for entry in randomList:
    try:
        print("The entry is", entry)
        r = 1/int(entry)
        break
    except Exception as e:
        print("Oops!", e.__class__, "occurred.")
        print("Next entry.")
        print()
print("The reciprocal of", entry, "is", r)

 

این برنامه همان خروجی برنامه فوق را دارد.

 

مدیریت استثناهای خاص در پایتون

در مثال فوق، ما هیچ استثنای خاصی را در بند except ذکر نکردیم.

این یک روش برنامه نویسی خوب نیست زیرا همه موارد استثنا را به دست می آورد و همه موارد را به همان شیوه اداره می کند. ما می توانیم مشخص کنیم که یک بند به جز (except) کدام موارد استثنایی باید در نظر گرفته شود.

یک بند try می تواند تعداد دیگری بند except برای مدیریت استثناهای مختلف داشته باشد، اما در صورت وقوع یک استثنا فقط یکی اجرا می شود.

ما می توانیم از تاپل برای تعیین چند مورد استثنا در یک بند به کار ببریم. در اینجا یک مثال آورده شده است.

try:
   # do something
   pass

except ValueError:
   # handle ValueError exception
   pass

except (TypeError, ZeroDivisionError):
   # handle multiple exceptions
   # TypeError and ZeroDivisionError
   pass

except:
   # handle all other exceptions
   pass

 

به وقوع پیوستن استثنا در پایتون

در برنامه نویسی پایتون، موارد استثنایی هنگام خطا در زمان اجرا کد مطرح می شوند. همچنین می توانیم با استفاده از کلمه کلیدی raise استثناها را به صورت دستی به وجود آوریم.

ما می توانیم به صورت اختیاری مقادیر را به استثنا منتقل کنیم تا روشن کنیم چرا این استثنا مطرح شده است.

>>> raise KeyboardInterrupt
Traceback (most recent call last):
...
KeyboardInterrupt

>>> raise MemoryError("This is an argument")
Traceback (most recent call last):
...
MemoryError: This is an argument

>>> try:
...     a = int(input("Enter a positive integer: "))
...     if a <= 0:
...         raise ValueError("That is not a positive number!")
... except ValueError as ve:
...     print(ve)
...    
Enter a positive integer: -2
That is not a positive number!

 

 

بند try و else در پایتون 

اگر بلوک کد بدون خطا اجرا شود، ممکن است بخواهید یک بلوک کد خاص را اجرا کنید. برای این موارد، می توانید از کلیدواژه اختیاری else با عبارت try استفاده کنید.

توجه: موارد استثنایی در بند else توسط موارد قبل در بند except قابل مدیریت نیستند.

بیایید به مثال زیر دقت کنیم:

# program to print the reciprocal of even numbers

try:
    num = int(input("Enter a number: "))
    assert num % 2 == 0
except:
    print("Not an even number!")
else:
    reciprocal = 1/num
    print(reciprocal)

 

خروجی

اگر یک عدد فرد داشته باشیم:

Enter a number: 1
Not an even number!

 

اگر یک عدد زوج داشته باشیم؛

Enter a number: 4
۰٫۲۵

 

با این حال، اگر ۰ را رد کنیم، ZeroDivisionError به عنوان بلوک کد داخل else به کار می رود و نه به عنوان بلوک except.

Enter a number: 0
Traceback (most recent call last):
  File "<string>", line 7, in <module>
    reciprocal = 1/num
ZeroDivisionError: division by zero

 

بند try…finally در پایتون

عبارت try در پایتون می تواند یک بند finally اختیاری داشته باشد. این بند بدون توجه به آنچه اجرا می شود، و به طور کلی برای انتشار منابع خارجی استفاده می شود.

به عنوان مثال، ممکن است از طریق شبکه به یک مرکز داده از راه دور متصل شویم یا با یک فایل یا رابط کاربری گرافیکی (GUI) کار کنیم.

در همه این شرایط، ما باید قبل از اینکه برنامه متوقف شود و چه با موفقیت اجرا شود یا نشود باید منبع را پاک کنیم. این اقدامات (بستن یک فایل، رابط کاربری گرافیکی یا قطع ارتباط از شبکه) در بند finally برای تضمین اجرای آن انجام می شود.

مثال:

try:
   f = open("test.txt",encoding = 'utf-8')
   # perform file operations
finally:
   f.close()

 

این نوع سازه اطمینان حاصل می کند که پرونده بسته است حتی اگر یک استثنا در هنگام اجرای برنامه رخ دهد.

منبع.

لیست جلسات قبل آموزش برنامه نویسی پایتون

  1. آموزش نصب و اجرای برنامه نویسی پایتون
  2. کلیدواژه ها و شناسه های برنامه نویسی پایتون
  3. دستورات، تورفتگی ها و کامنت ها در برنامه نویسی پایتون
  4. متغیرها، ثابت ها و لیترال ها در برنامه نویسی پایتون 
  5. انواع داده ها در برنامه نویسی پایتون
  6. تبدیل نوع در برنامه نویسی پایتون
  7. ورودی، خروجی و وارد کردن در برنامه نویسی پایتون
  8. عملگرها در برنامه نویسی پایتون
  9. نام و دامنه در برنامه نویسی پایتون
  10. دستور شرطی if…else در برنامه نویسی پایتون
  11. حلقه for در برنامه نویسی پایتون
  12. حلقه while در برنامه نویسی پایتون
  13. دستورات break و continue در برنامه نویسی پایتون
  14. دستور pass در برنامه نویسی پایتون
  15. توابع در برنامه نویسی پایتون
  16. آرگومان تابع در برنامه نویسی پایتون
  17. تابع بازگشتی در برنامه نویسی پایتون
  18. تابع بی نام/ تابع لامبدا در برنامه نویسی پایتون
  19. متغیرهای سراسری، محلی و غیر محلی در برنامه نویسی پایتون
  20. کلیدواژه global در برنامه نویسی پایتون
  21. ماژول های برنامه نویسی پایتون
  22. پکیج ها در برنامه نویسی پایتون
  23. اعداد و تبدیل نوع داده در برنامه نویسی پایتون 
  24. لیست در برنامه نویسی پایتون
  25. تاپل در برنامه نویسی پایتون 
  26. رشته ها در برنامه نویسی پایتون
  27. مجموعه ها در برنامه نویسی پایتون
  28. دیکشنری در برنامه نویسی پایتون
  29. عملیات ورودی/خروجی در برنامه نویسی پایتون 
  30. دایرکتوری و مدیریت فایل ها در برنامه نویسی پایتون
  31. خطاها و استثناهای توکار در برنامه نویسی پایتون
0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه