آموزش پایتون - مدیریت خطا

در این سری از مقالات قصد دارم نکات کلیدی که در زبان پایتون وجود دارد را ارائه کنم. در این مجموعه تلاش شده اطلاعات مختصر و کوتاه باشند و بر مهمترین نکات مورد نیاز تمرکز شود. 

بعد از گذراندن این دوره شما قادر خواهید بود که از هر کتابخانه پایتون استفاده کنید و بسته‌های پایتونی که خودتان نوشته‌اید را اجرا کنید.

عناوین دوره:

  1. مقدمه
  2. نصب و راه‌اندازی
  3. متغیرها و انواع داده
  4. عبارت‌های کنترلی
  5. توابع و ماژول‌ها
  6. هویت اشیاء
  7. مدیریت خطا
  8. برنامه‌نویسی شی‌گرا
  9. بسته‌بندی و انتشار کد

زمانی که برنامه نویسی می‌کنیم ممکن است اشتباهاتی داشته باشیم که در جریان اجرای یک برنامه منجر به خطا شود. این خطاها را می‌توان به طور کلی در دو کلاس خطای سینتکس و خطای منطقی (Exception) یا استثنا طبقه‌بندی کرد.

در مثال زیر یک نمونه خطای سینتکس که با علامت ^ نشان داده شده و به دلیل عدم رعایت ساختار تعریف تابع می‌باشد

خطای سینتکس
خطای سینتکس
خطای سینتکس

نمونه کد زیر نیز خطای منطقی ZeroDivisionError را نشان می‌دهد:

Image for post
Image for post

بنابراین هر عملیات غیرمجازی می‌تواند منجر به بروز خطا شود. پایتون چندین مورد استثنا built-in دارد که در پایتون ممکن است با آن مواجه شوید. می‌توانید لیست تمامی آن‌ها را با دستور زیر مشاهده کنید.

print(dir(locals()['__builtins__']))

در زیر برخی از موارد متداول لیست شده‌اند:

ImportError: خطای وارد کردن ماژول در کد 

IndexError: استفاده از ایندکس خارج از محدوده در یک لیست

NameError: استفاده از متغیر ناشناس در کد یا متغیری که تعریف نشده

SyntaxError: کد نمی‌تواند به درستی اجرا شود احتمالا سینتکس پایتون به درستی رعایت نشده

TypeError: یک تابع با مقداری از نوع نامناسب فراخوانی می شود

ValueError: یک تابع با مقداری از نوع صحیح فراخوانی می شود، اما با مقدار نامناسب.

 

همچنین در اینجا می‌توانید لیست کامل استثناها به همراه توضیحات را مشاهده کنید.


کنترل خطاها در برنامه‌نویسی پایتون

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

try:
	do_something()
except:
	print('exception')

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

Image for post
Image for post

در اینجا، ما نام استثنا را با استفاده از تابع exc_info درون ماژول sys چاپ کردیم. این امکان در پایتون وجود دارد که به تعداد مورد نیاز از بلوک‌های except با تعیین نوع استثنا استفاده کنیم.

try:
   # do something

except ValueError:
   # handle ValueError exception

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

except:
   # handle all other exceptions

در برنامه‌نویسی پایتون، همچنین می‌توانیم به طور دستی استثنا را با استفاده از کلیدواژه raise صدا بزنیم و از طریق استثنا توضیح دهیم که چرا این خطا رخ داده است.

Image for post
Image for post

گاهی این مورد ممکن است لازم شود که پس از اینکه یک قطعه کد درون بلوک try بدون هیچ مشکلی اجرا شد کد دیگری اجرا شود. برای این منظور از ترکیب try/except/else استفاده می‌شود:

try:
   # do something
   
except:
   # handle exceptions
   
else:
   # do something more

assert: این کلید واژه نیز زمانی بکار می‌رود که شما بخواهید یک عبارت را آزمایش کنید اگر نتیجه نادرست بود یک استثنا رخ می‌دهد، در کد زیر یک ورودی از کاربر درخواست می‌شود اگر عدد وارد شده زوج بود بلوک else اجرا می‌شود در غیر اینصورت با  توجه به assert یک استثنا رخ می‌دهد و بلوک except اجرا می‌شود.

Image for post
Image for post

کلیدواژه assert غالبا در ابتدا و انتهای تابع به منظور بررسی ورودی و خروجی معتبر توابع مورد استفاده قرار می‌گیرید

علاوه بر بلوک else، بلوک دیگری به نام finally وجود دارد که در هر صورتی بدون در نظر گرفتن نتیجه بلوک try اجرا می‌شود. این بلوک عموما برای آزاد کردن منابع خارجی مورد استفاده قرار می‌گیرد.

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

Image for post
Image for post

با مبحث فایل‌ها در مقالات بعدی آشنا خواهید شد.

همانطور که گفته شده در پایتون چندین مورد استثنا built-in تعریف شده است. همچنین هریک از پکیج‌ها و کتابخانه‌هایی که در پروژه‌های خود استفاده می‌کنید موارد دیگری نیز ممکن است تعریف شده باشد. شما نیز می‌توانید استثناهای خود را تعریف کنید. برای این کار نیاز است با مفهوم کلاس‌ها در پایتون آشنا باشیم. در مقاله بعدی نحوه تعریف کلاس‌ها و آبجکت‌ها در پایتون آشنا خواهیم شد.