آموزش مدیریت استثنا در برنامه نویسی پایتون ۳

3 سال پیش

آموزش مدیریت استثنا در برنامه نویسی پایتون ۳

در این درس از مجموعه آموزش برنامه نویسی سایت سورس باران، به آموزش مدیریت استثنا در برنامه نویسی پایتون ۳ خواهیم پرداخت.

پیشنهاد ویژه : پکیج آموزش طراحی وب سایت با پایتون و جنگو

پایتون دو ویژگی بسیار مهم را برای مدیریت هرگونه خطای غیرمنتظره در برنامه‌های پایتون شما و افزودن قابلیت‌های اشکال زدایی در آن‌ها فراهم می‌کند.

مدیریت استثنا (Exception Handling) – این مورد در این آموزش پوشش داده خواهد شد. در اینجا لیستی از استثناهای استاندارد موجود در پایتون وجود دارد – استثناهای استاندارد.

ادعاها – این در آموزش ادعاها در پایتون ۳ پوشش داده می شود.

استثناهای استاندارد

در اینجا لیستی از استثناهای استاندارد موجود در پایتون آمده است. –

۱ Exception

کلاس پایه برای همه استثناها

۲ StopIteration

زمانی که متد ()next یک تکرار کننده به هیچ شیئی اشاره نمی کند افزایش می یابد.

۳ SystemExit

توسط تابع ()sys.exit مطرح شده است.

۴ StandardError

کلاس پایه برای همه استثناهای داخلی به جز StopIteration و SystemExit.

۵ ArithmeticError

کلاس پایه برای تمام خطاهایی که برای محاسبه عددی رخ می دهد.

۶ OverflowError

هنگامی که یک محاسبه از حداکثر حد مجاز برای یک نوع عددی فراتر می رود، افزایش می یابد.

۷ FloatingPointError

وقتی محاسبه ممیز شناور با شکست مواجه می شود، افزایش می یابد.

۸ ZeroDivisonError

هنگامی که تقسیم یا مدول بر صفر برای همه انواع عددی انجام می شود، افزایش می یابد.

۹ AssertionError

در صورت شکست عبارت Assert مطرح می شود.

۱۰ AttributeError

در صورت عدم موفقیت مرجع یا تخصیص مشخصه افزایش می یابد.

۱۱ EOFError

زمانی که هیچ ورودی از تابع ()raw_input یا ()input وجود نداشته باشد و به انتهای فایل رسیده باشد، افزایش می یابد.

۱۲ ImportError

هنگامی که یک بیانیه واردات ناموفق است، افزایش می یابد.

۱۳ KeyboardInterrupt

هنگامی که کاربر اجرای برنامه را قطع می کند، معمولاً با فشار دادن Ctrl+c افزایش می یابد.

۱۴ LookupError

کلاس پایه برای همه خطاهای جستجو.

۱۵ IndexError

هنگامی که یک شاخص در یک دنباله یافت نمی شود، افزایش می یابد.

۱۶ KeyError

هنگامی که کلید مشخص شده در فرهنگ لغت یافت نمی شود، افزایش می یابد.

۱۷ NameError

هنگامی که یک شناسه در فضای نام محلی یا جهانی یافت نمی شود، افزایش می یابد.

۱۸ UnboundLocalError

هنگام تلاش برای دسترسی به یک متغیر محلی در یک تابع یا روش، اما هیچ مقداری به آن اختصاص داده نشده است، افزایش می یابد.

۱۹ EnvironmentError

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

۲۰ IOError

هنگامی که عملیات ورودی/خروجی با شکست مواجه می‌شود، مانند عبارت print یا تابع ()open هنگام تلاش برای باز کردن فایلی که وجود ندارد، افزایش می‌یابد.

۲۱ OSError

برای خطاهای مربوط به سیستم عامل افزایش یافته است.

۲۲ SyntaxError

هنگامی که خطایی در نحو پایتون وجود دارد، افزایش می یابد.

۲۳ IndentationError

زمانی که تورفتگی به درستی مشخص نشده باشد، بلند می شود.

۲۴ SystemError

هنگامی که مفسر یک مشکل داخلی پیدا می کند، مطرح می شود، اما وقتی با این خطا مواجه می شود، مفسر پایتون خارج نمی شود.

۲۵ SystemExit

هنگامی که مفسر پایتون با استفاده از تابع ()sys.exit  خارج می شود، افزایش می یابد. اگر در کد مدیریت نشود، باعث خروج مفسر می شود.

۲۶ TypeError

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

۲۷ ValueError

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

۲۸ RuntimeError

زمانی مطرح می شود که خطای ایجاد شده در هیچ دسته ای قرار نگیرد.

۲۹ NotImplementedError

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

 

ادعاها در پایتون

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

  • ادعاها توسط عبارت assert، جدیدترین کلمه کلیدی پایتون، که در نسخه ۱٫۵ معرفی شده است، انجام می شود.
  • برنامه نویسان اغلب در ابتدای یک تابع برای بررسی ورودی معتبر و پس از فراخوانی تابع برای بررسی خروجی معتبر، اظهارنظرها را قرار می دهند.
  • بیانیه ادعایی
    هنگامی که پایتون با یک عبارت ادعا روبرو می شود، عبارت همراه را ارزیابی می کند که امیدواریم درست باشد. اگر عبارت نادرست باشد، پایتون یک استثناء AssertionError را ایجاد می کند.

اگر ادعا با شکست مواجه شود، پایتون از ArgumentExpression به عنوان آرگومان برای AssertionError استفاده می کند. استثناهای AssertionError را می توان مانند هر استثنای دیگری با استفاده از دستور try-except گرفت و مدیریت کرد. اگر آنها رسیدگی نشوند، برنامه را خاتمه داده و یک ردیابی ایجاد می کنند.

مثال

در اینجا تابعی وجود دارد که دمای معین را از درجه کلوین به درجه فارنهایت تبدیل می کند. از آنجایی که ۰ درجه کلوین به همان اندازه سرد است، در صورت مشاهده دمای منفی، تابع از بین می رود.

#!/usr/bin/python3

def KelvinToFahrenheit(Temperature):
   assert (Temperature >= 0),"Colder than absolute zero!"
   return ((Temperature-273)*1.8)+32

print (KelvinToFahrenheit(273))
print (int(KelvinToFahrenheit(505.78)))
print (KelvinToFahrenheit(-5))

 

هنگامی که کد بالا اجرا می شود، نتیجه زیر را ایجاد می کند –

۳۲٫۰
۴۵۱
Traceback (most recent call last):
File "test.py", line 9, in <module>
print KelvinToFahrenheit(-5)
File "test.py", line 4, in KelvinToFahrenheit
assert (Temperature >= 0),"Colder than absolute zero!"
AssertionError: Colder than absolute zero!

 

استثنا چیست؟

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

هنگامی که یک اسکریپت پایتون یک استثنا را ایجاد می کند، باید فوراً استثنا را مدیریت کند در غیر این صورت خاتمه می یابد و خارج می شود.

رسیدگی به یک استثنا

اگر کد مشکوکی دارید که ممکن است یک استثنا ایجاد کند، می‌توانید با قرار دادن کد مشکوک در یک امتحان: بلاک، از برنامه خود دفاع کنید. پس از بلوک try:، عبارت استثنا: و به دنبال آن یک بلوک کد که تا حد امکان به زیبایی مشکل را حل می کند، اضافه کنید.

try:
   You do your operations here
   ......................
except ExceptionI:
   If there is ExceptionI, then execute this block.
except ExceptionII:
   If there is ExceptionII, then execute this block.
   ......................
else:
   If there is no exception then execute this block.

 

در اینجا چند نکته مهم در مورد نحو ذکر شده در بالا آمده است

  • یک دستور try منفرد می تواند چندین دستور به جز داشته باشد. این زمانی مفید است که بلوک try حاوی عباراتی باشد که ممکن است انواع مختلفی از استثناها را ایجاد کنند.
  • شما همچنین می توانید یک بند غیر عمومی ارائه دهید که هر استثنا را کنترل می کند.
  • بعد از بند(های)جز، می توانید یک بند else اضافه کنید. اگر کد موجود در بلوک try: استثنایی ایجاد نکند، کد موجود در بلوک else اجرا می‌شود.
  • other-block مکان خوبی برای کدهایی است که نیازی به محافظت از try: block ندارد.

مثال

این مثال یک فایل را باز می کند، محتوا را در فایل، می نویسد و با زیبایی بیرون می آید زیرا اصلا مشکلی وجود ندارد –

#!/usr/bin/python3

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print ("Error: can\'t find file or read data")
else:
   print ("Written content in the file successfully")
   fh.close()

 

این نتیجه زیر را ایجاد می کند –

Written content in the file successfully

 

مثال

این مثال سعی می‌کند فایلی را باز کند که در آن مجوز نوشتن ندارید، بنابراین یک استثنا ایجاد می‌کند

#!/usr/bin/python3

try:
   fh = open("testfile", "r")
   fh.write("This is my test file for exception handling!!")
except IOError:
   print ("Error: can\'t find file or read data")
else:
   print ("Written content in the file successfully")

 

این نتیجه زیر را ایجاد می کند –

Error: can't find file or read data

 

 

همچنین می توانید از دستور استثنا بدون هیچ استثنایی که به صورت زیر تعریف شده است استفاده کنید

try:
   You do your operations here
   ......................
except:
   If there is any exception, then execute this block.
   ......................
else:
   If there is no exception then execute this block.

 

 

این نوع دستور try-except تمام استثناهایی را که رخ می‌دهند را می‌گیرد. استفاده از این نوع عبارت try-except به عنوان یک روش برنامه نویسی خوب در نظر گرفته نمی شود، زیرا همه استثناها را می گیرد اما برنامه نویس را وادار نمی کند که علت اصلی مشکلی که ممکن است رخ دهد را شناسایی کند.

بند جز با استثناهای متعدد

همچنین می‌توانید از همان دستور استثنا برای مدیریت چندین استثنا به صورت زیر استفاده کنید

try:
   You do your operations here
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   If there is any exception from the given exception list, 
   then execute this block.
   ......................
else:
   If there is no exception then execute this block.

 

دستور try-finally

می توانید از یک بلوک final: همراه با یک بلوک try: استفاده کنید. در نهایت: بلوک مکانی برای قرار دادن هر کدی است که باید اجرا شود، خواه بلاک try-block استثنایی ایجاد کند یا خیر. نحو دستور try-finally این است –

try:
   You do your operations here;
   ......................
   Due to any exception, this may be skipped.
finally:
   This would always be executed.
   ......................

 

نکته – شما می توانید بند(های)به جز یا یک بند آخر را ارائه دهید، اما نه هر دو را. شما نمی توانید از بند else نیز در کنار یک بند نهایی استفاده کنید.

مثال

#!/usr/bin/python3

try:
   fh = open("testfile", "w")
   fh.write("This is my test file for exception handling!!")
finally:
   print ("Error: can\'t find file or read data")
   fh.close()

 

اگر مجوز باز کردن فایل را در حالت نوشتن ندارید، نتیجه زیر را ایجاد می کند –

Error: can't find file or read data

 

همین مثال را می توان به صورت زیر به طور واضح تر نوشت –

#!/usr/bin/python3

try:
   fh = open("testfile", "w")
   try:
      fh.write("This is my test file for exception handling!!")
   finally:
      print ("Going to close the file")
      fh.close()
except IOError:
   print ("Error: can\'t find file or read data")

 

این نتیجه زیر را ایجاد می کند –

Going to close the file

 

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

 

آرگومان یک استثنا

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

try:
   You do your operations here
   ......................
except ExceptionType as Argument:
   You can print value of Argument here...

 

اگر کدی را برای رسیدگی به یک استثنا بنویسید، می توانید یک متغیر داشته باشید که نام استثنا را در عبارت استثنا دنبال کند. اگر چندین استثنا را به دام انداخته‌اید، می‌توانید متغیری را دنبال کنید که تاپل استثنا را دنبال کند.

این متغیر مقدار استثنا را دریافت می کند که بیشتر شامل علت استثنا است. متغیر می تواند یک مقدار واحد یا چندین مقدار را در قالب یک تاپل دریافت کند. این تاپل معمولاً شامل رشته خطا، شماره خطا و محل خطا است.

مثال

در زیر مثالی برای یک استثنا ارائه شده است

#!/usr/bin/python3

# Define a function here.
def temp_convert(var):
   try:
      return int(var)
   except ValueError as Argument:
      print ("The argument does not contain numbers\n", Argument)

# Call above function here.
temp_convert("xyz")

 

این نتیجه زیر را ایجاد می کند –

The argument does not contain numbers
invalid literal for int() with base 10: 'xyz'

 

ایجاد یک استثنا

با استفاده از عبارت raise می توانید استثناها را به روش های مختلفی مطرح کنید. نحو کلی دستور raise به صورت زیر است –

raise [Exception [, args [, traceback]]]

 

در اینجا Exception نوع استثنا است (مثلا NameError) و آرگومان مقداری برای آرگومان استثناست. آرگومان اختیاری است. اگر ارائه نشده باشد، آرگومان استثنا None است.

آرگومان نهایی، Traceback، نیز اختیاری است (و به ندرت در عمل استفاده می شود)، و در صورت وجود، شی ردیابی مورد استفاده برای استثنا است.

مثال

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

def functionName( level ):
   if level <1:
      raise Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

 

نکته – برای گرفتن یک استثنا، یک عبارت “except” باید به همان استثنا اشاره کند که به عنوان یک شی کلاس یا یک رشته ساده پرتاب شده است. به عنوان مثال، برای گرفتن استثنای بالا، باید عبارت استثنا را به صورت زیر بنویسیم

try:
   Business Logic here...
except Exception as e:
   Exception handling here using e.args...
else:
   Rest of the code here...

 

مثال زیر استفاده از بالا بردن یک استثنا را نشان می دهد

#!/usr/bin/python3

def functionName( level ):
   if level <1:
      raise Exception(level)
      # The code below to this would not be executed
      # if we raise the exception
   return level

try:
   l = functionName(-10)
   print ("level = ",l)
except Exception as e:
   print ("error in level argument",e.args[0])

 

این نتیجه زیر را ایجاد خواهد کرد

error in level argument -10

 

استثناهای تعریف شده توسط کاربر

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

در اینجا یک مثال مربوط به RuntimeError است. در اینجا یک کلاس ایجاد می شود که از RuntimeError زیر کلاس بندی می شود. این برای زمانی مفید است که شما نیاز به نمایش اطلاعات خاص تری دارید که یک استثنا وجود دارد.

در بلوک try، استثنا تعریف شده توسط کاربر بالا می‌رود و در بلوک استثنا قرار می‌گیرد. متغیر e برای ایجاد نمونه ای از کلاس Networkerror استفاده می شود.

class Networkerror(RuntimeError):
   def __init__(self, arg):
      self.args = arg

 

بنابراین هنگامی که کلاس فوق را تعریف کردید، می توانید استثنا را به صورت زیر مطرح کنید –

try:
   raise Networkerror("Bad hostname")
except Networkerror,e:
   print e.args

 

منبع.

 

 

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

  1. آموزش برنامه نویسی پایتون ۳
  2. آموزش موارد جدید در برنامه نویسی پایتون ۳
  3. آموزش مرور کلی برنامه نویسی پایتون ۳
  4. آموزش راه اندازی محیط برنامه نویسی پایتون ۳
  5. آموزش نحو در برنامه نویسی پایتون ۳
  6. آموزش انواع متغیرها در برنامه نویسی پایتون ۳
  7.  آموزش عملگرهای پایه در برنامه نویسی پایتون ۳
  8.  آموزش تصمیم گیری در برنامه نویسی پایتون ۳
  9.  آموزش حلقه ها در برنامه نویسی پایتون ۳
  10. آموزش اعداد در برنامه نویسی پایتون ۳
  11. آموزش رشته ها در برنامه نویسی پایتون ۳
  12.  آموزش لیست ها در برنامه نویسی پایتون ۳
  13.  آموزش تاپل ها در برنامه نویسی پایتون ۳
  14. آموزش دیکشنری در برنامه نویسی پایتون ۳
  15.  آموزش تاریخ و زمان در برنامه نویسی پایتون ۳
  16.  آموزش توابع در برنامه نویسی پایتون ۳
  17. آموزش ماژول ها در برنامه نویسی پایتون ۳
  18. آموزش فایل های ورودی/خروجی در برنامه نویسی پایتون ۳
0
برچسب ها :
نویسنده مطلب erfan molaei

دیدگاه شما

بدون دیدگاه