خبرهای کلیکسب و کار برتر

Errors و Exceptions در پایتون

# exception چیست؟

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

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

شما با کلاس آموزش پایتون در اصفهان به راحتی می توانید دست به تولید نرم افزارهایی در حوزه آماری و اقتصادی یا مدیریتی بزنید

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

>>> print( 0 / 0 ))

File “”, line 1

print( 0 / 0 ))

^

SyntaxError: invalid syntax

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

>>> print( 0 / 0)

Traceback (most recent call last):

File “”, line 1, in

ZeroDivisionError: integer division or modulo by zero

این بار با یک exception مواجه شدید. این نوع خطا زمانی رخ می دهد که کد پایتون از نظر سینتکس درست بوده اما به یک ارور منطقی برخورد میکند. خط آخر پیام نشان می دهد که با چه نوع خطای استثنا مواجه شده اید. مفسر پایتون با استثناهای مختلف به درک بهتر از نوع خطا به ما کمک میکند.

در پایتون دو روش برای مدیریت خطا وجود دارد:

  1. Exception Handling
  2. Assertion

+ دستورهای try و except برای مدیریت استثنا

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

حالت کلی مدیریت استثنا در پایتون به شکل زیر است:

try:

You do your operations here;

………………….

except Exception1:

If there is Exception1, then execute this block.

except Exception2:

If there is Exception2, then execute this block.

………………….

else:

If there is no exception then execute this block.

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

در کد پایین یک فایل باز کرده و داخل آن چیزی مینویسیم. بخشی از کد که ممکن است ارور دهد را داخل بلاک try نوشته‌ایم. از آنجایی که کد ما مشکلی ندارد، اگر کد را اجرا کنیم بلاک try بدون ارور اجرا خواهد شد و بخش‌های except اجرا نخواهد شد. بخش else در صورتی که کد بدون مشکل کار کند، اجرا خواهد شد:

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()

 

# OUTPUT

Written content in the file successfully

در مثال دوم سعی میکنیم در فایلی بنویسیم که اجازه نداریم. به همین خاطر بخش try ارور داده و بخش except اجرا خواهد شد:

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”

 

# OUTPUT

Error: can’t find file or read data

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

try:

linux_interaction()

except AssertionError as error:

print(error)

else:

try:

with open(‘file.log’) as file:

read_data = file.read()

except FileNotFoundError as fnf_error:

print(fnf_error)

finally:

print(‘Cleaning up, irrespective of any exceptions.’)

Function can only run on Linux systems.

Cleaning up, irrespective of any exceptions.

x = 10

if x > 5:

raise Exception(‘x should not exceed 5. The value of x was: {}’.format(x))

در قطعه کد بالا اگر عدد x بزرگتر از 5 باشد یک خطا نمایش میدهیم.

# انواع خطا در پایتون

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

در لیست زیر، مهم ترین exception های پایتون آورده شده اند:

نوع استثنا دلیل ایجاد شدن خطا
AssertionError اگر شرط بررسی شده با assert درست نباشد. برای اطلاعات بیشتر را ببینید
AttributeError اگر ویژگی درخواست شده وجود نداشته باشد
EOFError اگر مشکلی در پایان فایل وجود داشته باشد. برای اطلاعات بیشتر را ببینید
FloatingPointError اگر عملیات انجام شده روی نوع داده float به مشکل بخورد
GeneratorExit اگر متد close روی یک جنریتور صدا زده شود. برای اطلاعات بیشتر را ببینید
ImportError اگر ماژول ایمپورت شده پیدا نشود
IndexError اگر ایندکس درخواست شده در دنباله وجود نداشته باشد
KeyError اگر کلید درخواست شده در دیکشنری وجود نداشته باشد
KeyboardInterrupt اگر کاربر دکمه ctrl+c یا delete را بزند
MemoryError اگر پردازش در حال اجرا با کمبود حافظه مواجه شود
NameError اگر متغیر خواسته شده در محدوده محلی یا جهانی پیدا نشود. برای اطلاعات بیشتر را ببینید
NotImplementedError اگر متد انتزاعی ایجاد نشده باشد. برای اطلاعات بیشتر را ببینید
OSError اگر یک عملیات سیستم باعث خطا در سیستم عامل شود
OverflowError اگر نتیجه یک عملیات حسابی بیش از حد بزرگ باشد که قابل نمایش نباشد
RuntimeError اگر خطای ایجاد شده در هیچ یک از دسته بندی ها قرار نگیرد
StopIteration اگر متد next به انتهای یک دنباله برسد
SyntaxError اگر مفسر با یک خطای نحوی مواجه شود
IndentationError اگر مشکلی در تورفتگی وجود داشته باشد. برای اطلاعات بیشتر را ببینید.
TabError هنگامی که تورفتگی از tab ها و فاصله های ناسازگار تشکیل شده باشد
SystemError زمانی که مفسر با یک مشکل داخلی مواجه شود
SystemExit این استثنا توسط تابع sys.exit ایجاد میشود
TypeError اگر نوع آبجکت انتخاب شده برای عملیات نامناسب باشد
ValueError اگر فانکشن آرگومانی با نوع درست اما مقدار اشتباه دریافت کند
ZeroDivisionError اگر عملیات تقسیم روی عدد صفر انجام شود

 

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

# ساخت یک استثنا جدید در پایتون

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

در پایتون تمام استثناهای داخلی از کلاس Exception ارثبری میکنند. شما هم اگر بخواهید یک استثنا جدید بسازید باید کلاسی داشته باشید که مستقیم یا غیر مستقیم از این کلاس ارثبری کند:

>>> class CustomError(Exception):

…     pass

 

>>> raise CustomError

Traceback (most recent call last):

__main__.CustomError

 

>>> raise CustomError(“An error occurred”)

Traceback (most recent call last):

__main__.CustomError: An error occurred

زمانیکه در حال توسعه یک پروژه بزرگ پایتونی هستید، بهتر است که تمام استثناها را در یک فایل جداگانه قرار دهیم. این فایل ها معمولا exceptions.py یا errors.py نام دارند.

# نتیجه گیری: مدیریت خطا در پایتون

بعد از یاد گرفتن اینکه exception یا استثنا چیست و تفاوت آن سینتکس ارور، روش های مختلف برای مدیریت خطای رخ داده را دیدید:

  • دستور raise برای نمایش یک استثنا استفاده میشود.
  • عبارت try، تمام دستورات را تا زمانی که با یک استثنا مواجه شوید اجرا می کند.
  • دستور except برای گرفتن و کنترل کردن استثناها استفاده میشود.
  • دستور else زمانی فعال میشود که هیچ یک از except ها نتوانند خطا را مدیریت کنند.

دستور finally که همیپایتون دو امکان ویژه برای مدیریت خطاهای پیشبینی نشده در اپلیکیشن ها فراهم کرده و قابلیت های اشکال زدایی (debugging) پرکاربردی به آن ها اضافه می کند.

  • Exception Handling: در آموزش حاضر به تشریح مدیریت خطاها و استثناها خواهیم پرداخت. در زیر لیستی از خطاهای استاندارد از در پایتون را مشاهده می کنید.
  • Assertion ها: این مبحث در آموزش مربوطه ی خود مورد پوشش قرار می گیرد.

assert Expression[, Arguments]

مثال

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

#!/usr/bin/python

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)

کد بالا پس از اجرا، نتیجه ی زیر را بدست می دهد:

32.0

451

Traceback (most recent call last):

File “test.py”, line 9, in

print KelvinToFahrenheit(-5)

File “test.py”, line 4, in KelvinToFahrenheit

assert (Temperature >= 0),”Colder than absolute zero!”

AssertionError: Colder than absolute zero!

Exception (خطای زمان اجرا و پیشبینی نشده) چیست؟

Exception یک رخداد (event) است که در طول اجرا برنامه رخ می دهد و روند اجرای برنامه را مختل می نماید. در کل، زمانی که اسکریپت پایتون با شرایطی که قابلیت مدیریت آن را ندارد، مواجه می شود، یک خطا صادر می کند. exception در پایتون یک آبجکت پایتون است که نماینده ی خطا می باشد.

زمانی که اسکریپت پایتون یک خطا (exception) صادر می کند، یا باید خطا را مدیریت کند و یا برنامه را به طور کلی ببندد.

مدیریت Exception (خطا)

در صورت مواجه با کد مشکوک که ممکن است سبب رخداد خطا شود، می توانید آن را داخل بدنه ی try: قرار دهید. پس از بدنه ی try:، یک دستور except: در متن برنامه درج کرده و به دنبال آن قطعه کدی که مشکل برنامه را به صورت بهینه اداره می کند، تایپ نمایید.

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

در زیر نحوه ی بکار بردن دستور try …except … else را مشاهده می کنید:

در زیر نکات آموزشی مهمی در خصوص ساختار فوق عنوان شده است:

  • یک دستور try واحد می تواند چندین دستور متناظر except داشته باشد. این ویژگی به خصوص زمانی مفید واقع می شود که بدنه ی try حامل دستورات متعددی باشد که ممکن است هر یک خطای متفاوتی را سبب شود.
  • می توانید یک عبارت except سراسری (generic) تنظیم کنید که هر خطایی را به راحتی مدیریت نماید.
  • می توانید پس از دستور یا دستورات except، عبارت else را مورد استفاده قرار دهید. چنانچه کد موجود در بدنه ی try: خطا نداد، آنگاه قطعه کد else اجرا می شود.
  • قطعه کد else جای مناسبی برای تعریف کدهایی می باشد که احتمالا مشکلی برای کل برنامه ایجاد نکرده و اجرای بدون خطای آن حتمی است.

مثال

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

#!/usr/bin/python

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

عبارت except بدون مشخص کردن نوع خطا

می توانید از دستور except که هیچ خطا یا exception ای در آن تعریف نشده نیز به صورت زیر استفاده نمایید و در واقع چنانچه هر گونه خطایی وجود داشت، دستور موجود در قطعه کد except را انجام دهد:

try:

You do your operations here;

………………….

سعی کن یک عملیاتی را در اینجا انجام دهی

except:

If there is any exception, then execute this block.

در صورت برخورد با خطا،  عملیات دیگری را انجام بده

Assert در پایتون |Finally در پایتون

else:

If there is no exception then execute this block.

در غیر این صورت این کار را انجام بده

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

عبارت except با چندین Exception

می توانید با یک دستور except همزمان چندین exception را به صورت زیر مدیریت نمایید:

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:

You do your operations here;

عملیات را در اینجا انجام دهید

………………….

Due to any exception, this may be skipped.

ممکن است به دلیل وجود هر گونه خطایی این کد اجرا نشود

finally:

This would always be executed.

دستوری که حتما اجرا خواهد شد

………………….

مثال

#!/usr/bin/python

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”

اگر مجوز باز کردن فایل در سطح درج اطلاعات در آن را نداشته باشید، در آن صورت نتیجه ی زیر حاصل می گردد:

Error: can’t find file or read data

مثال فوق را می توان به صورت کارا و مختصرتر نیز، همچون نمونه کد زیر، نوشت:

#!/usr/bin/python

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”

آرگومان ارسال شده به Exception

try:

You do your operations here;

………………….

except ExceptionType, Argument:

You can print value of Argument here…

اگر کدی بنویسید که تنها یک خطا (exception) را مدیریت کند، در آن صورت کافی است یک متغیر پس از اسم خطا، در دستور except، لحاظ نمایید. چنانچه لازم است چندین خطا را گیر انداخته و مدیریت نمایید، در آن صورت می توانید متغیری پس از چندتایی exception خطا (متغیر exception از نوع چندتایی یا tuple) لحاظ نمایید.

این متغیر مقدار خطا که یک رشته باشد را گرفته و در واقع دلیل بروز خطا را در خود ذخیره می کند. این متغیر می تواند یک مقدار را دریافت کند یا همزمان چندین مقدار را در قالب یک چندتایی (tuple) در خود نگه دارد. این متغیر چندتایی (از نوع tuple) اغلب حامل رشته ی متنی خطا، شماره ی خطا و محل رخداد آن می باشد.

مثال

مثال زیر تنها یک خطا را مدیریت می کند.

#!/usr/bin/python

# Define a function here.

def temp_convert(var):

try:

return int(var)

except ValueError, 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 [Exception [, args [, traceback]]]

مثال

exception می تواند یک رشته، کلاس و یا آبجکت باشد. اغلب خطاهایی که Python core صادر می کند از جنس کلاس هستند و یک آرگومان نیز دارند که نمونه ای از آن کلاس می باشد. تعریف خطاهای جدید امری بسیار آسان است و به راحتی زیر قابل پیاده سازی می باشد:

def functionName( level ):

if level <1:>

منبع: اموزش پایتون فرادرس

 

خطاهای اختصاصی و user-defined

 

 

پایتون به توسعه دهنده این امکان را می دهد تا خطاهای دلخواه خود را تعریف کند. برای این منظور می بایست از کلاس های درون ساخته ی exception ارث بری نماید.

 

 

 

class Networkerror(RuntimeError):

def __init__(self, arg):

self.args = arg

 

 

زمانی که کلاس فوق را تعریف کردید، آنگاه می توانید خطا را به صورت زیر اعلان و پیاده سازی کنید:

 

 

try:

raise Networkerror(“Bad hostname”)

except Networkerror,e:

print e.args

 

 

  • شه اجرا میشود

 

دکمه بازگشت به بالا