خطا و مدیریت Exceptions
خطا معمولا در کدهای مشکلدار رخ میدهند و باعث خروج از برنامه میشوند. بنابراین باید خطاها را بشناسیم و برایشان راهحل در نظر بگیریم. به عنوان مثال اگر انتظار متغیری از نوع عدد صحیح داریم و متغیر متنی به تابع مورد نظر داده میشود، TypeError خواهیم داشت. جهت مدیریت Exceptions از سه دستور اصلی try، except و fainally میتوان استفاده کرد.
try: برنامه یا قسمتی از برنامه که میبایست از نظر خطا مورد بررسی قرار گیرد، در آن قرار میگیرد.
except: وقتی خطا در قسمت try اتفاق میافتد، به این بخش وارد میشویم. یعنی برنامهایی است که در زمان وقوع خطا، در برنامه اصلی اجرا میشود.
finally: بلوکی از برنامه که چه خطا رخ دهد چه ندهد میبایست اجرا گردد.
نحوه استفاده از try و except در هنگام رخ دادن خطا
برای بررسی خطا، در کد زیر یک تابعی را تعریف کردهایم که دو عدد آرگومان را میگیرد و مجموع این دو عدد را برمیگرداند. اگر یکی از این آرگومانها را به صورت تابع input() یک ورودی از user بگیریم، به دلیل اینکه تابع input ورودی را به صورت string برمیگرداند، با TypeError مواجه میشویم.
برای جلوگیری از نمایش این خطا از دستورات try و except استفاده میکنیم. به این صورت که اگر کدی که در بلوک try قرار دارد خطا داد. دستور except را اجرا میشود، اگر نه دستور else را اجرا میشود.
در کد زیر برای جلوگیری از نمایش خطا از دستور try و except استفاده کرده و به جای خطا میبینیم که عبارت مقابل print چاپ میشود.
از دستور except در مدیریت Exceptins میتوان چندین بار استفاده کرد. همچنین در مقابل دستور except میتوان انواع خطا که امکان دارد رخ دهد را نوشت.
با توجه به مدیریت Exceptions، در کد فوق ابتدا بدنه مربوط به try اجرا میشود. اگر خطا رخ ندهد که کد اجرا میشود و سپس وارد بدنه finally میشود. اما اگر یکی از خطا های فوق رخ دهد. کد وارد بدنه except آن خطا شده و عملیات مربوط به آن بدنه اجرا میشود. در نهایت چه خطا رخ دهد و چه خطا رخ ندهد بدنه دستور finally اجرا میشود.
مدیریت Exceptions در لوپها
در صورتیکه در لوپها خطا رخ بدهد، بالافاصله کد از لوپ خارج میشود. در مدیریت Exceptions برای جلوگیری از خارج شدن از یک لوپ میتوان از دستورات try و except استفاده کرد.
در کد زیر لوپ while در صورتی که با خطا مواجه شد دیگر متوقف نمیشود و دستور except اجرا میشود و دوباره به دلیل دستور continue به ابتدای while خواهد رفت. اگر با خطا نیز مواجه نشد دستور else اجرا میشود و به دلیل وجود break از لوپ while خارج میشویم. دستور finally هم چه با خطا مواجه بشویم چه نشویم اجرا خواهد شد.
در کد فوق، ابتدا بدنه try اجرا میشود. اگر عدد، به ورودی داده شود خطا رخ نمیدهد و بدنه else اجرا میشود. سپس از آنجایی که در بدنه else دستور break استفاده شده است، از لوپ خارج میشویم. اما اگر خطا رخ دهد وارد بدنه except شده. و چون از دستور continue استفاده شده است پس از آنگه عبارت not a number چاپ شد. ادامه کد اجرا نمیشود و دوباره به اول لوپ برمیگردد. این روند ادامه پیدا میکند تا ورودی درست به input داده شود.
تمرین خطا و exception
در کد زیر به دلیل اینکه نوع داده ورودی برای عملیات به توان رساندن string میباشد، و مناسب این عملیات نیست با خطای TypeError مواجه میشویم. در این صورت با مدیریت Exceptions و با دستور except میتوان به جای موجه شدن با خطا نوع خطا را چاپ کرد.
در کد زیر به دلیل اینکه متغیر x بر صفر تقسیم میشود با خطا ZeroDivisionError مواجه میشویم. در این صورت با دستور except میتوان به جای مواجه شدن با خطا نوع خطا را چاپ کرد.
در کد زیر به دلیل اینکه مقدار را به تابع input به جای integer به صورت string دادهایم با خطا ValueError مواجه میشویم. در این صورت با مدیریت Exceptions میتوان با دستور except به جای مواجه شدن با خطا، نوع خطا را چاپ کرد. با استفاده از continue در بلوک except خطهای بعد از آن run نمیشود و دوباره کد به ابتدای while میرود و بلوک داخل try دوباره تکرار میشود. اگر با خطا مواجه نشدیم، قسمت else اجرا میشود. که در اینجا به دلیل وجود دستور break کد از لوپ خارج میشود.
برای آشنایی بیشتر با مباحث خطا و مدیریت Exceptions و نحوه کار با آنها میتوانید به دوره جامع آموزش زبان برنامهنویسی پایتون آکادمی رسا مراجعه کنید.