رفتن به مطلب
سرور های مجازی ارزان ، هاست ربات لینوکسی ارزان ، پیشنهاد ویژه باتچی ! ×
انجمن تخصصی بات چی | BotChi | انجمن ربات تلگرام

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


seyyedmehdi

ارسال‌های توصیه شده

مدیریت خطاها

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

>>> omelet["pate"] Traceback (most recent call last):
File "<stdin>", line 1, in ?
KeyError: 'pate'

همانطور که مشاهده می کنید نوع خطا KeyError می باشد . شما می توانید با استفاده از دستور … try … except خطاهای بوجود آمده را مدیریت نمایید در این حالت کد های مورد نظر در داخل بخش try نوشته می شود و با استفده از بخش except و تعیین نوع خطای بوجود آمده دستوراتی را که باید هنگام بوجود آمدن این خطا اجرا شوند را بنویسید . مثالی را مطرح کرده و در آن سعی می کنیم به اندیسی دسترسی یابیم که وجود ندارد .

>>> omelet={“egg”:۲,“pepper”:۱,“cheese”:۱, “milk”:۱}
>>> try:
...     if omelet[“mushroom”] > 0:
...         print “Sure, it have some mushroom”
... except KeyError:
...     print “Aww, there’s no mushroom. Lets go shopping !”
...
Aww, there’s no mushroom. Lets go shopping !

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

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

>>> print 55/0
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ZeroDivisionError: integer division or modulo by zero
  

و یا در حالت های دیگر اگر بخواهید برای مثال به اندیسی از یک آرایه (لیست , دیکشنری یا تیوپل ) دسترسی داشته باشید که وجود ندارد دوباره یک استثنا می باشد . در همه حات ها پیام خطا دارای دو بخش می باشد نوع خطا که قبل از دو نقطه می آید و توضیحی در مورد خطا که بعد از دو نقطه ظاهر می گردد . معمولا پایتون در بخشی به نام Traceback محل وقوع خطا را نیز مشخص می کند .
معمولا ما قصد داریم تعداد این خطا ها به حداقل برسد . ولی چون به صفر رساندن آنها غیر ممکن می باشد باید تمحیداتی را برای مدیریت این خطاها و جلوگیری از خاتمه برنامه باندیشیم . در پایتون می شه این مدیریت بر خطاها و استثناها را از طریق try و except انجام داد .
برای مثال فرض کند شما نام یک فایل را از کاربر می گیرید و قصد دارید آنرا باز کنید اگر مشکلی در انجام این فرایند پیش بیاید برای مثال اگر فایل موجود نباشد نمی خواهیم برنامه قفل کند یا ناخواسته خاتمه یابد بلکه ما می خواهیم این خطاها مدیریت شده و کاربر از خطای اتفاق افتاده آگاه شده و تصمیمی درست در جهت رفع آن بیندیشد یا حتی خود برنامه تصمیم گیری کند .
به مثال زیر توجه کنید در این مثال نام یک فایل پرسیده شده و با استفاده از try و except سعی بر باز کردن آن می گردد :

filename = raw_input('Enter a File name : ')
try :
fp = file(filename, "r")
except :
print 'There is no file named ', filename

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

def GetAge():
age = input ("Enter your age : ")
if age < 18 :
raise 'BadNumberError' , 'Your age must be greader than 18 !!'
return age

همانطور که مشاهده می کنید این تابع یک عدد را از کاربر دریافت می کند و اگر مقدار آن کمتر از ۱۸ باشد یک استثنا ایجاد می کند و در حالت عادی اجرای برنامه را متوقف می کند . دستور raise دو متغییر می گیرد اولی نوع استثنا و دومی اطلاعاتی در مورد خطای اتفاق افتاده نوع استثنای BadNumberError یک نوع جدید از استثنا هست که ما از آن در این تابع استفاده کرده ایم .
در هنگام استفاده از try و except می توانید اطلاعات ارسالی از تابع raise را دریافت و چاپ کنید :

>>> s=[] >>> try:
...     print s[1] ... except IndexError,er:
...     print "We have an error : ",er
...
We have an error :  list index out of range

در مثال زیر نیز نحوه مدیریت جدا و همزمان چندین خطا را مشاهده می کنید .

s = [5,6,0,2] x = input("Enter an Index : ")
try:
print "%.2f" %(10.0/s[x])
except IndexError :
print "Sorry , we have not this index !!"
except ZeroDivisionError :
print "The value of this index is zero ! i can not devide it .."

نمونه ای از خروجی

Enter an Index : 2
The value of this index is zero ! i can not devide it ..
Enter an Index : 10
Sorry , we have not this index !!
Enter an Index : 1
۱.۶۷

 

لینک به دیدگاه
به اشتراک گذاری در سایت های دیگر

به گفتگو بپیوندید

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

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   بازگردانی قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...