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

آنچه در این مطلب می‌آموزید:

  • روش صحیح نوشتن بلوک Try Except در پایتون را یاد می‌گیرید.

  • با مهم‌ترین تفاوت‌های بین خطاهای استثنا و خطاهای معمولی آشنا می‌‌شوید.

  • با تکنیک‌های مختلف پیاده‌سازی بلوک except  آشنا شده و برای هر کدام مثالی را بررسی می‌کنید.

  • با کلمه کلیدی raise آشنا شده و روش استفاده از آن را برای اعلام خطا یاد می‌گیرید.

  • مهمترین مزایا و معایب استفاده از ساختار Try Except در پایتون را متوجه می‌شوید.

فهرست مطالب این نوشته
997696

در این مطلب از مجله فرادرس به بررسی Try Except در پایتون پرداخته‌ایم. ابتدا با سینتکس این ساختار آشنا می‌شویم. سپس تفاوت‌های مهم بین خطاهای استثنا و خطاهای معمولی را بیان می‌کنیم. بعد از آن روش استفاده از ساختار Try Except در پایتون را با کمک مثال‌های ساده‌ای توضیح می‌دهیم. در نهایت هم مزایا و معایب استفاده از بلوک‌های «Try Except» را در پایتون بیان کرده‌ایم.

Try Except در پایتون چه کاربردی دارد؟

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

برای مدیریت خطاهای استثنا در پایتون از ساختار Try Except استفاده می‌کنیم. وقتی خطایی در بلوک Try اتفاق می‌افتد، پایتون ادامه اجرای کدهای این بلوک را متوقف می‌کند. سپس به سراغ بلوک «استثنا» (Exception) می‌رود. با کمک این بلوک، برنامه نویسان خطاهای اعلام شده را طوری مدیریت می‌کنند که برنامه کرش نکند.

سینتکس Try Except در پایتون

برای مدیریت خطا‌های استثنا در پایتون از بلوک‌های try  و except  و else  و finally  استفاده می‌کنیم. در کادر پایین ترتیب قرار دادن این بلوک‌ها را نوشته‌ایم.

در زمان مدیریت خطاهای استثنا هر کدام از این بلوک‌‌ها مسئولیت خاصی را برعهده دارند. عملکرد این بلوک‌ها را در فهرست پایین توضیح داده‌ایم.

  • بلوک try: در بلوک try  کد اصلی برنامه را می‌نویسیم. این کد ممکن است در زمان اجرا با یکی از حالت‌های استثنا روبه‌رو شود. کلمه «try» به معنی تلاش کردن است. از آن‌جا که پایتون تلاش می‌کند کدهای نوشته شده در این بلوک را اجرا کند نام این بلوک try  گذاشته شده است. در صورت رویدادن استثنا و بروز خطا، فرایند اجرای کدها بلافاصله به بلوک except  منتقل می‌شود.
  • بلوک except: این بلوک به برنامه نویسان برای مدیریت حالت‌های استثنا کمک می‌کند. اگر کدهای نوشته شده در بلوک try  با خطای استثنایی روبه‌رو شوند، پایتون ادامه اجرای کدها را به بلوک except  منتقل می‌کند. اکنون نوبت اجرای کدهای درون بلوک except  است. برنامه نویسان می‌توانند استثناهای خاص را به صورت جداگانه مدیریت کنند. همچنین امکان استفاده از یک بلوک کلی برای دریافت و کنترل تمام خطاهای استثنایی نیز وجود دارد. این روش را در بخش‌های بعدی مطلب با کمک مثال بررسی کرده‌‌ایم.
مستطیل آبی رنگی که به چهار مستطیل زرد رنگ متصل شده است.
در تصویر بالا چهار بلوک موجود در ساختار Try Except در پایتون را معرفی کرده‌ایم.
  • بلوک else: استقاده از بلوک else  اختیاری است. اما اگر از این بلوک استفاده کردیم باید بعد از همه بلوک‌های except  قرار بگیرد. بلوک else  فقط وقتی اجرا می‌شود که بلوک try  با هیچ خطا و حالت استثنایی روبه‌رو نشده باشد. گاهی از اوقات می‌خواهیم که اگر کدهای بلوک try  بخوبی و بدون مشکل اجرا شدند، دسته‌ای از کدهای دیگر هم اجرا شوند. استفاده از بلوک else  روش مناسبی برای اجرای آن دسته از کدها است.
  • بلوک finally: کدهای نوشته شده در بلوکfinally  همیشه اجرا می‌شوند. بدون در نظر گرفتن اینکه آیا حالت استثنایی رخ داده است یا نه. به طور کلی از این کدها برای اجرای «عملیات پاکسازی» (Cleanup Operations) استفاده می‌کنیم. عملیات پاک‌سازی به کارهایی مانند بستن فایل‌ها یا آزاد کردن منابع گفته می‌شود.
چند کارگر کوچک بر روی مادربرد در حال تعمیر خطاهای بوجود آمده هستند.

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

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

You can't divide by zero!
Execution complete.

در فهرست پایین، تمام عملیات کدهای بالا را توضیح داده‌ایم.

  • بلوک try: در این بلوک از کاربر خواسته‌ایم عددی را وارد کند. سپس عدد وارد شده توسط کاربر را بر عدد 100 تقسیم می‌کنیم.
  • بلوک except: در این بخش از دو بلوک except  استفاده کرده‌ایم. با کمک این بلوک‌ها حالت‌های استثنای مربوط به خطای تقسیم بر صفر «ZeroDivisionError» و نامعتبر بودن داده ورودی «ValueError» را مدیریت کردیم.
  • بلوک else: اگر هیچ خطایی رخ نداد کدهای درون بلوک else  اجرا می‌‌شوند. در این کد، دستور داده‌ایم که نتیجه اجرای برنامه بر روی خروجی چاپ شود.
  • بلوک finally  : همین‌طور که می‌دانیم کدهای این بلوک بدون توجه به مقدار نهایی خروجی چاپ می‌شوند. با کمک این کدها به کاربر نشان می‌دهیم که اجرای برنامه به پایان رسیده است.

مثالی از مدیریت خطای ساده در پایتون

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

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

Can't be divided by zero!

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

یادگیری پایتون با کمک فیلم‌های آموزشی فرادرس

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

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

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

تفاوت بین استثنا و خطا در پایتون چیست؟

در این بخش از مطلب،خطای استثنا را با دیگر خطاها مقایسه کرده‌ایم. مهم‌ترین تفاوت‌های «خطا» (Error) و استثنا» (Exception) در فهرست زیر نوشته شده‌اند.

  • «خطا» (Error): خطا به مشکلات جدی گفته می‌‌شود. برنامه‌ها نباید این مشکلات را مدیریت کنند. خطا معمولا مشکلی در منطق کد یا پیکربندی برنامه است. خود برنامه نویس باید خطاها را تعمیر و رفع کند. به عنوان مثال‌هایی از این دسته خطاها می‌توانیم به خطای مربوط به سینتکس یا مدیریت حافظه اشاره کنیم.
  • «استثنا» (Exception): شدت مشکل بوجود آمده توسط استثنا کمتر از خطا است. در نتیجه خود برنامه‌ها هم می‌توانند استثانا‌ها را مدیریت کنند. این نوع از مشکلات ممکن است در موقعیت‌های مختلفی پیش‌بیایند. برای مثال اگر کاربری داده‌های ورودی نامعتبر وارد کند. یا فایل‌هایی در برنامه گم شوند. یا مشکلاتی در شبکه به وجود بیایند.

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

«خطای نحوی یا سینتکس» (Syntax Error) به دلیل اشتباه در کدنویسی اتفاق می‌افتد. وجود این خطا‌ از اجرا شدن کدهای برنامه جلوگیری می‌‌‌کند. اصلا نمی‌توان چنین خطایی را در برنامه مدیریت کرد. این خطا باید توسط برنامه نویس و به صورت دستی رفع شود. در عوض خطای استثنایی مانند ZeroDivisionError – که بر اثر تقسیم بر صفر روی می‌دهد – را می‌توان در طول اجرای برنامه مدیریت کرد. برای مدیریت استثنا‌ها از بلوک Try Except در پایتون استفاده می‌کنیم.

روش استفاده از Try Except در پایتون

از ساختار Try Except در پایتون برای دریافت و مدیریت انواع خطاهای استثنا استفاده می‌کنیم. در بخش‌ بعدی مطلب، رایج‌ترین خطاهای استثنا در پایتون را معرفی کرده‌ایم. در این بخش، روش استفاده از بلوک‌های try  و except  و else  و finally  را آموزش می‌دهیم.

یکی از بهترین روش‌های یادگیری استفاده از بلوک‌های try  و except  و else  و finally، پیاده‌سازی آن‌ها در پروژه‌های عملی است. با این تکنیک دانشجویان می‌توانند تمام مهارت‌های خود را به صورت عملی استفاده کنند. برای رسیدن به این هدف پیشنهاد می‌کنیم که فیلم آموزش برنامه نویسی پایتون همراه با بررسی مثال های عملی در Python + گواهینامه را از فرادرس مشاهده کرده و در مثال‌های مختلف از ساختار Try Except در پایتون استفاده کنید. برای کمک به مخاطبان مجله لینک این فیلم آموزشی را در پایین نیز قرار داده‌ایم.

بلوک try چگونه کار می‌کند؟

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

یک صفحه سفید با لوله‌ای قرمز رنگ بر روی آن - Try Except در پایتون

در فهرست پایین، روش کار بلوک try  را به شکل دقیق، توضیح داده‌ایم.

  1. ابتدا کدهای عبارت try  اجرا می‌شوند.
  2. اگر در زمان اجرای این کدها هیچ خطای استثنایی رخ نداد، فقط بلوک try  اجرا خواهد شد. عبارت except  نادیده گرفته می‌‌شود.
  3. اما اگر هر خطای استثنایی رخ بدهد، ادامه کار در بلوک try  رها شده و برنامه به سراغ اجرای بلوک except  می‌رود.
  4. اگر خطای استثنای اعلام شده توسط بلوک except  مدیریت نشده بود، روند اجرای برنامه به بلوک try  خارجی – به شرط اینکه وجود داشته باشد – سپرده می‌‌شود. اگر برای مدیریت خطای استثنا، هیچ رفتاری برنامه‌ریزی نشده بود، اجرای برنامه متوقف می‌شود.
  5. هر بلوک try  می‌تواند چندین بلوک except  مختلف داشته باشد.

در کادر زیر، مثال ساده‌ای را درباره اجرای بلوک‌های Try Except در پایتون، پیاده‌سازی کرده‌ایم.

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

Yeah ! Your answer is : 1

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

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

Sorry ! You are dividing by zero 

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

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

The error is:  unsupported operand type(s) for //: 'int' and 'str'
The error is:  integer division or modulo by zero

بلوک Else چگونه کار می‌کند؟

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

در کدهای زیر، مثالی برای استفاده از بلوک else نوشته‌ایم. این بخش باید بعد از بلوک‌های Try Except در پایتون قرار بگیرد.

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

-5.0
a/b result in 0

بلوک Finally چگونه کار می‌کند؟

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

مهندسین کامپبوتر در اتاقی نشسته و برنامه نویسی می‌کنند.

در کادر پایین، سینتکس مربوط به روش قرار دادن این بلوک در ساختار Try Except را نوشته‌ایم.

در کدهای زیر روش استفاده از این بلوک را نشان داده‌ایم. ابتدا خطای استثنای تقسیم بر صفر در بلوک try  اتفاق می‌افتد. سپس در بلوک except  این خطا را دریافت کرده و پیغام مناسبی برای آن نمایش می‌دهیم. در آخر هم کدهای نوشته شده در بلوک finally  اجرا می‌شوند.

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

Can't divide by zero
This is always executed

رایج‌ترین حالت‌های استثنا در پایتون

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

  • BaseException: این حالت، کلاس پایه‌ای است که تمام خطاهای استثنای «درونی» (Built-In) پایتون از آن مشتق شده‌اند.
  • Exception: کلاس پایه برای تمام خطاهای استثنایی است که باعث توقف برنامه نمی‌شوند.
  • ArithmeticError: کلاس پایه برای تمام خطاهای استثنایی که به عملیات ریاضی مربوط می‌شوند.
  • ZeroDivisionError: این خطای استثنا وقتی اعلام می‌شود که در عملیات تقسیم در پایتون «//» یا باقیمانده صحیح «%» مقسوم‌علیه صفر باشد.
  • OverflowError: این حالت، زمانی اعلام می‌شود که نتیجه عملیات عددی از بیشینه مقدار در آن نوع داده، بیشتر شود.
  • FloatingPointError: هر وقت عملیات مربوط به اعداد اعشاری با شکست روبه‌رو‌ شود این حالت پیش میاید.
  • AssertionError: زمانی رخ می‌دهد که دستور assert  با شکست مواجه شود.
  • AttributeError: این حالت زمانی روی می‌دهد که ارجاع یا تخصیص ویژگی با شکست روبه‌رو شود.
  • IndexError: زمانی روی می‌دهد که در یک عملیات به اندیس خارج از محدوده در دنباله – مانند لیست یا تاپل – اشاره کنیم.
  • KeyError: وقتی اعلام می‌شود که کلید مورد نظر در دیکشنری پیدا نمی‌شود.
  • MemoryError: وقتی این حالت رخ می‌دهد که عملیات محاسباتی خاصی با کمبود حافظه روبه‌رو شود.
  • NameError: وقتی که نام محلی یا جهانی پیدا نشود این حالت استثنا رخ می‌دهد.
  • OSError: اگر یکی از وظایف سیستمی مانند خواندن یا نوشتن اطلاعات بر روی فایل‌ها با شکست روبه‌رو شود این خطا روی می‌دهد.
  • TypeError: این خطا زمانی روی می‌دهد که از توابع بر روی داده‌های با نوع اشتباه استفاده کنیم.
  • ValueError: این حالت وقتی اتفاق می‌افتد که تابعی به درستی فراخوانی شده است. اما داده‌های ارسال شده به آن – به عنوان پارامتر – غلط باشند.
  • ImportError: این خطا زمانی روی می‌دهد که در عبارت import  اشتباهی انجام داده باشیم.
  • ModuleNotFoundError: این خطای استثنا وقتی اعلام می‌شود که مفسر پایتون موفق به پیدا کردن ماژول مورد نظر نشود.

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

مانیتوری که بر روی آن مثلث خطر نشان داده شده است - Try Except در پایتون

شناسایی حالت‌های استثنا به کمک Try Except در پایتون

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

گرفتن خطاهای استثنای مشخص

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

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

Not Valid!

در کدهای بالا ابتدا خطای استثنا ValueError روی می‌دهد. زیرا برنامه نمی‌تواند رشته s”str” را به عدد صحیح تبدیل کند. اگر مقدار x  برابر با ۰ باشد عملیات تبدیل نوع با موفقیت انجام می‌شود. در این حالت هم خطای استثنای ZeroDivisionError روی می‌دهد. زیرا تقسیم بر صفر در محاسبات برنامه نویسی باعث روی دادن خطا می‌شود.

گرفتن چند استثنای مختلف به صورت هم زمان

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

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

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

Error invalid literal for int() with base 10: 'twenty'

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

  • وقتی که برنامه مقدار twenty  را به عدد صحیح تبدیل کند، خطای ValueError رخ می‌دهد.
  • اگر عملیات نوشته شده در برنامه بر روی مقادیری با نوع غیر عدد صحیح انجام شود، خطای TypeError  رخ می‌دهد. اما در این کد این خطا روی نمی‌دهد. زیرا برنامه به درستی نوشته شده است.
  • اگر برنامه بخواهد به اندیسی خارج از محدوده‌ی لیست دسترسی پیدا کند، خطای IndexError  روی می‌دهد. اما در سناریو کد بالا این مسئله هم مدیریت شده است.
ربات‌های کوچک به انتظار ایستاده‌اند تا فرمان مدیریت خطاها صادر شود.

مدیریت تمام حالت‌های استثنا در یک بلوک

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

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

Something went wrong!

خطای ArithmeticError  شامل موارد مختلفی است. یکی از زیرمجموعه‌های این خطا، حالت استثنای ZeroDivisionError است. این خطاها زمانی روی‌ می‌دهند که اشتباهی در تقسیم اعداد اتفاق بی‌افتند. در کدهای بالا به‌جای این خطا، خطای استثنای TypeError اتفاق افتاد. این خطا بخاطر آن است که مقداری با نوع داده‌ی اشتباه را تقسیم کرده‌ایم. در واقع در این مثال، مقداری با نوع رشته را بر مقداری با نوع عدد صحیح تقسیم می‌کنیم.

در بلوک دوم except  هیچ نوع خطایی را به صورت مشخص معرفی نکرده‌ایم. به این نوع از بلوک‌های except  ، بلوک «Catch-All Except» گفته می‌شود. زیرا از این بلوک‌ برای مدیریت تمام حالت‌های استثنای نام‌برده نشده در بالا استفاده می‌کنیم. با کمک این بلوک در کدهای بالا خطای TypeError را مدیریت می‌کنیم. اما استفاده از این تکنیک می‌تواند باعث بروز مشکل شود. زیرا دیگر پیغام‌ واضحی در زمان روبه‌رو شدن با حالت‌های استثنا وجود ندرد. در نتیجه، برنامه نویس، دلیل واقعی خطا را تشخیص نمی‌دهد.

یادگیری پیاده سازی پروژه های پایتون با کمک فیلم‌های فرادرس

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

در پایین، چند مورد از فیلم‌‌های آموزش پروژه‌محور زبان پایتون را معرفی کرده‌ایم.

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

مجموعه آموزش پروژه محور برنامه نویسی پایتون (Python)
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه فیلم‌های آموزش پروژه محور برنامه نویسی پایتون هدایت شوید.

اعلام کردن حالت استثنا

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

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

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

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

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

Age cannot be negative.

در کدهای بالا تابع set  منفی بودن مقدار سن age  را بررسی می‌کند. اگر مقدار داده شده به تابع – به عنوان سن – منفی بود، حالت استثنای ValueError توسط تابع اعلام می‌شود. در زمان اعلام این حالت، پیغامی هم برای نشان دادن دلیل خطا تنظیم شده است. این ساختار، باعث می‌شود که هیچ‌ وقت مقدار سن، عدد منفی نباشد. در نتیجه یکپارچگی داده‌ها حفظ می‌شود.

مزایا و معایب Try Except در پایتون

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

در این بخش از مطلب مزایا و معایب استفاده از ساختار‌های Try Except در پایتون را بررسی کرده‌ایم.

مزایای استفاده از Try Except در پایتون

در ابتدا مزیت‌های این ساختار را توضیح داده‌ایم. وجود این مزیت‌ها علت اصلی استفاده از Try Except در پایتون هستند.

  • افزایش خوانایی برنامه: با مدیریت مناسب خطاهای استثنا می‌توانیم از کرش کردن برنامه‌ها جلوگیری کنیم. با استفاده از این ساختار می‌توانیم از بوجود آمدن نتایج غلط بر اثر خطاهای ناخواسته یا داده‌های ورودی اشتباه هم پیشگیری کنیم.
  • ساده‌سازی عملیات مدیریت خطا: با استفاده از بلوک‌های Try Except در پایتون، بخش مربوط به مدیریت خطا از بدنه اصلی کدها جدا می‌شود. در نتیجه درک و خواندن منطق برنامه و کدها ساده‌تر شده و نگهداری آن‌هم راحت‌تر می‌شود.
  • نوشتن کدهای تمیز‌تر: به کمک تکنیک‌های مدیریت استثنا در پایتون، برنامه نویسان از به کار بردن عبارت‌های شرطی پیچیده برای بررسی خطا بی‌نیاز می‌شوند. در نتیجه، کدها ساده‌تر، خواناتر و حرفه‌ای‌تر نوشته می‌شوند.
  • دیباگ کردن ساده‌تر کدها: وقتی که خطای استثنایی اعلام می‌شود، مفسر پایتون بر روی کنسول پیغامی چاپ می‌کند. این پیغام، محل دقیق وقوع خطای استثنا را نشان می‌دهد. در نتیجه اشکال‌زدایی کد آسان‌تر می‌‌شود.

معایب استفاده از Try Except در پایتون

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

  • عملکرد کند‌تر: استفاده از بلوک‌های Try Except در پایتون برای بررسی خطاها نسبت به عبارت if  کندتر است. این مسئله بخاطر آن است که مفسر پایتون برای شناسایی و مدیریت استثناها باید عملیات بیشتری انجام دهد.
  • افزایش پیچیدگی کدها: استفاده زیاد از ساختارهای مدیریت خطا ممکن است خوانایی کد را کاهش دهد. این مشکل به طور خاص زمانی اتفاق می‌افتد که توسعه‌دهنده بخواهد چند نوع خطای مختلف را مدیریت کرده یا از قوانین پیچیده‌ای استفاده کند.
  • احتمال وقوع خطرهای امنیتی: اگر خطاهای استثنا را به درستی مدیریت نکنیم، احتمال دارد اطلاعات محرمانه‌ای درباره کدها در کنسول به نمایش گذاشته شود. در نتیجه امنیت برنامه به خطر می‌افتد. بنابراین مدیریت صحیح حالت‌های استثنا از اهمیت بسیار زیادی برخوردار است. نباید اطلاعات اضافی درباره برنامه و عملکرد آن نمایش داده شود.
معایب استفاده از Try Except در پایتون

جمع‌بندی

در این مطلب از مجله فرادرس با بلوک‌های Try Except در پایتون آشنا شده‌ایم. این ابزار برای مدیریت خطاهای حالت استثنا به کار برده می‌‌شود. شکل کامل آن شامل بلوک‌های try  و except  و else  و finally  است. کدهای اصلی برنامه را در بلوک try  قرار می‌دهیم. سپس انواع استثنا‌های احتمالی را با کمک بلوک‌های except  مدیریت می‌کنیم. از بلوک else  برای زمانی استفاده می‌کنیم که کدهای اصلی برنامه – در بلوک try  - بدون مشکل اجرا شدند. کد‌های درون بلوک finally  هم بدون توجه به اجرای صحیح کدها یا رویدادن خطا در هر حالتی اجرا می‌شوند.

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

source

توسط expressjs.ir