آموزش ایجاد خطا با دستور raise در پایتون

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

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

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

در این آموزش با یک مثال پیش می‌رویم. فرض کنید در حال توسعه یک نرم‌آفزار پزشکی هستیم و تابعی داریم که در بخشی از برنامه، برای انجام محاسبات روی سن بیمار فراخوانی می‌شود. واضح است که عدد -15 و یا رشته متنی 'omid' ورودی‌های معتبری برای این تابع نیستند. بنابراین بهتر است در چنین حالاتی، یک استثنا یا Exception با پیام مرتبط ایجاد کنیم.

فیلم آموزش این مبحث
12:05

برای عضویت در دوره ویدئویی می‌تونید به «دوره جامع پایتون در کالج» مراجعه کنید. با ثبت‌نام رایگان در دوره، به تمام جلسات اصلی، جلسات تکمیلی، تمرین‌ها، آزمون‌ها و منابع مازاد دسترسی کامل خواهید داشت. (+ گواهی‌نامه پایان دوره با قابلیت استعلام آنلاین)

دستور raise در پایتون

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

وقتی مفسر پایتون به خط کدی شبیه به کد زیر می‌رسد، یک Exception ایجاد کرده و برنامه را متوقف می‌کند.

raise Exception()
نمونه خروجی ایجاد استثنا با raise Exception
نمونه خروجی ایجاد استثنا با raise Exception

به‌عنوان آرگومان ورودی سازنده کلاس Exception می‌توانیم یک رشته متنی به‌عنوان پیام خطا نیز بدهیم؛ یعنی چیزی شبیه به دستور زیر:

raise Exception("این یک خطای نمونه است.")

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

ایجاد Exception دلخواه در پایتون

الآن ما یک استثنای کلی ایجاد کرده‌ایم؛ اما بهتر است در موقعیت‌های مختلف، خطاها و استثناهای مرتبط‌تری (به‌جای Exception که کلی است) ایجاد کنیم.

دو روش برای ایجاد استثنای دلخواه داریم:

  1. استفاده از کلاس‌های خطای داخلی پایتون (یا اصطلاحاً Built-in Exceptions)
  2. ایجاد یک کلاس خطای اختصاصی و استفاده از آن

با دستور raise در پایتون می‌توانیم هر دو نوعِ این خطاها را ایجاد کنیم. در این آموزش برای اینکه وارد بحث ایجاد کلاس اختصاصی نشویم، صرفاً از خطاهای built-in استفاده می‌کنم و مثال می‌زنم. در آموزش جداگانه‌ای در مورد ایجاد خطای اختصاصی بحث خواهم کرد.

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

def process_age(age):    # محل مناسب برای بررسی‌ها و اعتبارسنجی‌ها    print(f"Your age is: {age}")

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

در قطعه کد زیر، از یک ساختار شرط در پایتون استفاده کرده‌ام. سپس به‌جای اینکه یک Exception عمومی ایجاد کنم، خطایی از نوع ValueError ایجاد کرده‌ام.

def process_age(age):    if age < 0:        raise ValueError("عدد سن نمی‌تواند منفی باشد!")    print(f"Your age is: {age}")

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

Traceback (most recent call last):
File "/home/omid/SabzDanesh/raise-exception.py", line 10, in <module>
process_age(-15)
~~~~~~~~~~~^^^^^
File "/home/omid/SabzDanesh/raise-exception.py", line 6, in process_age
raise ValueError("عدد سن نمی‌تواند منفی باشد!")
ValueError: عدد سن نمی‌تواند منفی باشد!
آموزش تابع در پایتون و ترفندهای حرفه‌ای

آموزش تابع در پایتون و ترفندهای حرفه‌ای

ایجاد انواع استثناها با دستور raise

علاوه بر ValueError می‌توانیم از سایر کلاس‌های خطای built-in نیز استفاده کنیم. برای مثال، در قطعه کد زیر، قبل از اینکه منفی بودن age را بررسی کنم، بررسی می‌کنم که آیا نوع داده age از نوع int (عدد صحیح) است یا خیر.

def process_age(age):    if not isinstance(age, int):        raise TypeError("سن باید عدد صحیح باشد.")    if age < 0:        raise ValueError("عدد سن نمی‌تواند منفی باشد!")    print(f"Your age is: {age}")

اگر مقداری که برای age به تابع فرستاده شده باشد، غیر عدد صحیح باشد، با استثنای TypeError با پیام «سن باید عدد صحیح باشد» مواجه شده و اجرای تابع متوقف می‌شود. گاهی اوقات گفته می‌شود که raise Exception در پایتون برخورده‌ایم.

مثال خروجی خطای raise TypeError در کد مثال
مثال خروجی خطای raise TypeError در کد مثال

لیست برخی از Exceptionهای پیشفرض پایتون

در جدول زیر، برخی از کلاس‌های استثنای داخلی (همان built-in) پایتون را می‌بینید. از تمام این کلاس‌ها می‌توانیم در هر جایی از کد و با همین ساختاری که تا اکنون آموزش دیده‌ایم استفاده کنیم.

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

پیشنهاد می‌کنم که پیام خطای مرتبط را حتماً استفاده کنید. این‌گونه می‌توانید به فردی که از تابع شما استفاده می‌کند به‌طور دقیق‌تر توضیح دهید که چرا چنین خطایی رخ داده است.

نام کلاس استثناتوضیح مختصر
Exceptionکلاس پایه تمامی استثناها
ValueErrorمقدار ورودی نامعتبر
TypeErrorنوع داده نامعتبر
IndexErrorدسترسی به اندیس ناموجود
KeyErrorدسترسی به کلید ناموجود
ZeroDevisionErrorتقسیم بر صفر

در مستندات رسمی پایتون (اینجا +)، لیستی از تمام استثناهای داخلی وجود دارد.

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

یادگیری پایتون قدم به قدم از صفر
دوره جامع و رایگان آموزش پایتون
می‌خوام الان شروع کنم!

جمع‌بندی ایجاد خطا با raise در پایتون

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

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

به‌طور خلاصه، کلاسی ایجاد می‌کنیم که از Exception ارث‌بری می‌کند و در صورت نیاز، متدهای لازم را override و کلاس را شخصی‌سازی می‌کنیم. درباره این موضوع، در جلسات بعدی این دوره آموزشی همراه با مثال بحث خواهم کرد.

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

یادتان باشد که وقتی یک Exception در برنامه رخ می‌دهد، اجرای برنامه متوقف می‌شود. بنابراین هنگام استفاده از تابعی که ممکن است raise Exception کند، بهتر است از ساختار try except برای مدیریت خطا در پایتون استفاده کنیم.

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

« جلسه قبلی آموزشمدیریت خطا در پایتونجلسه بعدی آموزش »ماژول در پایتون

این آموزش بخشی از یک آموزش جامع و قدم به قدم در سبز دانش است: دوره رایگان آموزش پایتون