منطبق با جدیدترین نگارش - قسمت 18
آموزش رایگان پایتون (python)- آشنایی با نحوه به دام انداختن خطاها در پایتون
در شماره گذشته آموزش پایتون با طبقه‌بندی‌ خطاها آشنا شدیم و دیدیم که شناسایی و برطرف کردن خطاهای زمان کامپایل به مراتب ساده‌تر از خطاهای زمان اجرا است. در این شماره قصد داریم با نحوه مدیریت خطاها در پایتون آشنا شویم.

1606683296_1_0.gif

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


نحوه گرفتن خطاها (استثناء‌ها) در پایتون

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

آشنایی با استثناء‌های از پیش ساخته شده

پایتون یکسری بلوک‌های از پیش ساخته شده مدیریت استثناء‌ها در اختیار دارد. برای مشاهده فهرست کامل این بلوک‌ها به آدرس https://docs.python.org/3.3/library/exceptions.html مراجعه کنید. در این صفحه فهرستی از بلوک‌های مدیریت استثناء‌های مختلف را مشاهده می‌کنید که برای مدیریت خطاهای مختلف استفاده می‌شوند. بلوک‌های از پیش ساخته شده پایتون که برای مدیریت خطاها استفاده می‌شوند در گروه‌های زیر طبقه‌بندی می‌شوند.

کلاس‌های پایه

کلاس‌های پایه، بلوک‌های ضروری (همچون Exception) برای مدیریت استثناء‌ها را ارائه می‌کنند. به‌طور مثال زمانی که از محاسبات ریاضی در برنامه خود استفاده می‌کنید ممکن است برای مدیریت خطاهایی که ممکن است رخ دهد مجبور شوید از استثناء ArithmeticError استفاده کنید.

کلاس‌هایی برای مدیریت استثناء‌های پیچیده

برنامه‌ها می‌توانند خطاهای پیچیده‌ای تولید کنند، خطاهایی که غلبه بر آن‌ها در برخی موارد دشوار بوده و در ظاهر هیچ راهی برای مدیریت خطاها در اختیار برنامه‌نویس قرار ندارد. به‌طور مثال، زمانی که یک سیستم پیغام خطای عدم وجود حافظه را نشان می‌دهد، پایتون یک خطای MemoryError را تولید می‌کند. بازیابی این خطا سخت‌ است، زیرا همیشه این امکان در اختیار ما قرار ندارد تا حافظه‌ استفاده شده از سوی سایر برنامه‌های کاربردی را آزاد کرده و از آن استفاده کنیم یا زمانی که کاربر کلید Ctrl+C را فشار می‌دهد، پایتون استثناء KeyboardInterupt را تولید می‌کند. در چنین حالتی برنامه مجبور است پیش از آن‌که سایر وظایف خود را انجام دهد به این استثناء رسیدگی کند.

استثناء‌های سیستم‌عامل

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

هشدارها

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

مدیریت استثناء‌های پایه

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

اداره کردن استثناء انفرادی

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

1.IDLE را باز کرده، از منوی File گزینه New File را انتخاب کنید.

2. دستورات زیر را در پنجره پایتون وارد کنید. (در زمان تایپ دستورات به تورفتگی‌ها دقت کنید.)

try:

    Value = int(input("Type a number between 1 and 10:"))

except ValueError:

    print("You must type a number between 1 and 10!")

else:

    if (Value > 0) and (Value <= 10):

        print("You typed: ", Value)

    else:

       print("The value you typed is incorrect!")

3. قطعه کد بالا با یک دستور جدید به نام try کار خود را آغاز کرده است. try در اصول بلوکی است که برای مدیریت استثناء‌ها از آن استفاده می‌شود. این تکنیک به شما کمک می‌کند تا استثناء‌هایی که ممکن است در زمان ورود مقادیر به وجود آید را مدیریت کنیم. در قطعه کد بالا فرمان input که برای دریافت ورودی از کاربر و تبدیل این ورودی به یک مقدار صحیح استفاده می‌شود جزیی از بلوک try است. حال اگر کاربر در زمان درج یک مقدار ورودی به اشتباه یک مقدار رشته‌ای را وارد کند، برنامه دیگر از اجرا بازنخواهد ایستاد، بلکه با نمایش پیغامی به کاربر اعلام می‌شود که ورودی او باید یک مقدار عددی در محدود 1 تا 10 باشد. (در بلوک except) اما دقت کنید. در قطعه کد بالا شیوه مدیریت خطاها به شکل محدود است. به عبارت دیگر، اگر خطایی خارج از این بلوک رخ دهد برنامه نمی‌تواند آن‌را مدیریت کند. برخی از برنامه‌نویسان سعی می‌کنند تمام کدهای اجرایی خود را درون بلوک‌ مرکزی و واحد قرار دهند تا هرگونه استثناء تولید شده از سوی بلوک دریافت شود. در مقابل برخی دیگر ترجیح می‌دهند از بلوک‌های مدیریت استثناء کوچک‌تری برای مدیریت خطاها استفاده کنند تا به شکل سفارشی بر نحوه اداره خطاها نظارت داشته باشند.

اگر خطاهایی در زمان درج ورودی در برنامه پدیدار شد، در مرحله بعد بلوک except اجرا می‌شود. except یکی دیگر از دستورات کلیدی پایتون است که همراه با try برای مدیریت خطاها استفاده می‌شود. بلوک except برای رسیدگی به یک استنثاء خاص استفاده می‌شود که در قطعه کد بالا این بلوک برای رسیدگی به استثناء ValueError استفاده شده است. در این حالت زمانی که کاربر یک خطای (اشتباه بودن مقدار) ValueError را تولید می‌کند، (یک مقدار رشته‌ای را به جای یک مقدار عددی وارد می‌کند) بلوک فوق برای مدیریت خطای فوق اجرا شده و فرمان print با نمایش پیغام خطایی این مسئله را به کاربر گوشزد می‌کند. دقت کنید در این حالت اگر کاربر خطاهای دیگری را تولید کند؛ بلوک except قادر نیست آن خطاها را مدیریت کند. اما اگر ورودی‌ها بدون مشکل باشند مجموعه دستوراتی که درون بلوک else قرار دارند اجرا می‌شوند. ما از آن جهت دستورات اصلی خود را درون بلوک else قرار دادیم که نیاز داریم اگر ورودی‌ها به شکل درستی وارد شدند، مجموعه دستورات ما اجرا شوند. حال اگر کاربر مقداری درست در محدوده مشخص شده را وارد کند، مقدار وارد شده از سوی کاربر توسط فرمان if بررسی شده و اگر معتبر بود مقدار روی صفحه چاپ می‌شود.

3. برنامه خود را ذخیره کرده و از منوی Run گزینه Rum Module را انتخاب کنید.

4. اکنون مقدار Hello را تایپ کرده و کلید اینتر را فشار دهید. همانند تصویر زیر برنامه یک پیغام خطای کنترل شده به کاربر نشان می‌دهد.

5. برنامه را دومرتبه اجرا کرده و اینبار مقدار 5.5 را وارد کنید. بازهم برنامه پیغام خطایی به کاربر نشان می‌دهد.

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

7. برنامه را اجرا کرده و این مرتبه مقدار 7 را وارد کنید، برنامه بدون نمایش هیچ‌گونه پیغام خطایی مقدار وارد شده را روی صفحه‌ نشان می‌دهد.

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

گرفتن خطاها بدون مشخص کردن نوع مشخصی از خطاها

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

1.IDLE را باز کرده و از منوی File گزینه New File را انتخاب کنید.

2. مجموعه دستورات زیر را درون پنجره جدید وارد کنید.

try:

Value = int(input("Type a number between 1 and 10:"))

except:

   print("You must type a number between 1 and 10!")

else:

   if (Value > 0) and (Value <= 10):

      print("You typed: ", Value)

   else:

     print("The value you typed is incorrect!")

3. تنها تفاوتی که قطعه کد بالا با مثال قبلی دارد در این است که دستور کلیدی except این مرتبه بدون مشخص کردن هیچ‌گونه استثناء مشخصی اجرا خواهد شد. در نتیجه بلوک except محدود به استثناء (درج مقدار اشتباه) ValueError نیست و قادر است هرگونه خطایی را مدیریت کند.

4. برنامه خود را ذخیره کرده و از منوی Run گزینه Run Module را انتخاب کنید.

5. مقدار Hello را تایپ کرده و کلید اینتر را فشار دهید. پیغام خطایی همانند شکل زیر ظاهر می‌شود

6. ‌برنامه را دومرتبه اجرا کرده و این مرتبه مقدار 5.5 را تایپ کرده و کلید اینتر را فشار دهید. برنامه پیغام خطای عدم درج مقدار صحیح را نشان می‌دهد.

7. برنامه را اجرا کرده و این مرتبه مقدار 7 را وارد کرده و کلید اینتر را فشار دهید. برنامه بدون مشکل مقدار وارد شده را چاپ می‌کند.

8. اکنون برنامه را دومرتبه اجرا کرده و این‌بار کلید‌های Ctrl+c را فشار دهید. دیگر پیغام خطایی را مشاهده نخواهید کرد و حتا اگر کلیدهای فوق را فشار دهید، بازهم برنامه قادر است به این حالت واکنش نشان داده و منتظر دریافت ورودی باقی بماند. این تکنیک مدیریت خطا زمانی سودمند است که درباره حالت‌های مختلفی که ممکن است باعث بروز یک خطا شوند اطمینان ندارید. پیاده‌سازی تکنیک مدیریت کلی استثناء‌ها به شما این اطمینان خاطر را می‌دهد که داده‌هایی را از دست نخواهید داد و مهم‌تر از آن برنامه شما نیز با یک روش جامع خطاها را مدیریت خواهید کرد.

در شماره آینده آموزش پایتون مباحث دیگر مرتبط با مدیریت خطاها را بررسی خواهیم کرد.

ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را می‌توانید از کتابخانه‌های عمومی سراسر کشور و نیز از دکه‌های روزنامه‌فروشی تهیه نمائید.

ثبت اشتراک نسخه کاغذی ماهنامه شبکه     
ثبت اشتراک نسخه آنلاین

 

کتاب الکترونیک +Network راهنمای شبکه‌ها

  • برای دانلود تنها کتاب کامل ترجمه فارسی +Network  اینجا  کلیک کنید.

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

  • اگر قصد یادگیری برنامه‌نویسی را دارید ولی هیچ پیش‌زمینه‌ای ندارید اینجا کلیک کنید.

ایسوس

نظر شما چیست؟