دوره H برنامه نویسی پایتون
فصل چهارم: استثناها و فایل ها در پایتون
درس اول: مدیریت استثناها (خطاها) در پایتون
به فصل 4 خوش آمدید! فصلی که در آن با استثنا (Exception)ها و یا خطاها سر و کار خواهیم داشت تا بتوانیم آنها را مدیریت و هندل کنیم.
تابحال خطاهای مختلفی دیدید! مثلا فرض کنید دستور input ای نوشتید که از کاربر بخواهد عددی وارد کند، سپس کاربر به جای عدد، یک رشته به input تحویل میدهد و شما بعد از دریافت آن، آن را به عدد تبدیل میکنید؛ اما چون پایتون نمیتواند این کار را انجام دهد، برنامه دچار خطا شده و متوقف میشود! بنابراین این استثناها یا همان خطاها، زمانی رخ میدهند که برنامه به مشکل برخورد کند! که دو سوال پیش میآید:
- چگونه بفهمیم که خطا رخ داده و از متوقف شدن برنامه جلوگیری کنیم؟!
- چگونه جلوی اتفاق افتادن خطا را بگیریم؟!
طبیعتا میتوان قبل از تبدیل رشته به عدد، بررسی کرد که آیا رشته یک عدد است یا خیر که میشود پاسخ سوال دوم! اما روشهایی نیز در هر زبان برنامهنویسی وجود دارد که به کمک آنها، برنامه میتواند متوجه خطا شده و با منطقی که نوشتهایم، آن را مدیریت کند؛ چرا که همواره نمیتوان جلوی روی دادن خطاها را گرفت و بعضی اوقات مجبوریم که خطاها را مدیریت کنیم. 🙂
ایجاد یک خطا
اجازه دهید ابتدا یک مثال عملی داشته باشیم که خطایی تولید کند. برای مثال، در دروس فصلهای قبل گفتیم که تقسیم بر صفر ممکن نیست و تعریف نشده است؛ و اگر چنین چیزی بنویسیم، برنامه متوقف شده و خطا صادر میشود. پس بیایید چنین چیزی بنویسیم! ? بصورت زیر:
1 2 3 |
num1 = 7 num2 = 0 print(num1/num2) |
نتیجه چه خواهد شد؟!
1 2 3 |
>>> ZeroDivisionError: division by zero >>> |
بله خطا رخ داد! خطای ZeroDivisionError! ?
باید توجه داشته باشید که خطاهای مختلف، بخاطر دلایل مختلفی رخ میدهند؛ که از مرسومترین خطاها، میتوان به موارد زیر اشاره کرد:
- ImportError: یک ایمپورت ماژول ناموفق
- IndexError: یک لیست که مثلا به ایندکس نامعتبر و خارج از محدودهی آن دسترسی داشتهایم
- NameError: استفاده از یک متغیر ناشناخته
- SyntaxError: خطا در سینتکس کد نوشته شده
- TypeError: مثلا یک تابع با یک مقدار از نوع نامناسب فراخوانی شده است
- ValueError: مثلا یک تابع با یک مقدار از نوع مناسب فراخوانی شده است؛ اما مقدرا آن مناسب نیست!
پایتون شامل استثنائات مختلف دیگری نیز در داخل خود و بصورت built-in است. مانند ZeroDivisionError که در بالا اشاره شد. یا OSError و …
همچنین کتابخانههای شخص ثالث نیز میتوانند برای خود، استثناعات خود را تعریف کنند و خود شما نیز میتوانید چنین کاری را انجام دهید.
مدیریت خطا در پایتون
برای مدیریت خطاها و اینکه به برنامه بگوییم وقتی خطایی رخ داد، چه کاری انجام دهد؛ میتوان از دستورات try و except استفاده کرد. بلوک try شامل کدی خواهد بود که ممکن است خطایی از داخل آن پرتاب شود و اگر چنین اتفاقی رخ دهد، کد داخل try متوقف شده و سپس کد داخل بلوک except اجرا میشود. و از اینرو اگر خطایی در try رخ ندهد، کد داخل except نیز اجرا نخواهد شد.
برای مثال:
1 2 3 4 5 6 7 8 |
try: num1 = 7 num2 = 0 print (num1 / num2) print("Done calculation") except ZeroDivisionError: print("An error occurred") print("due to zero division") |
در اینجا، بک بلوک try ایجاد و سپس دو عدد داخل آن تعریف کردیم که یکی از آنها صفر است. عدد اول را بر آن تقسیم میکنیم که باعث ایجاد خطای ZeroDivisionError میشود! سپس except را بلافاصله بعد از بلوک try مینویسیم تا در صورت روی دادن خطایی، کد آن اجرا شود؛ اما مقابل except بایستی نوع خطا را نیز مشخص کنیم. یعنی به این صورت که خطایی از try اگر پرتاب شد، نوع except متناسب با آن اجرا شود!
خروجی این کد بصورت زیر است:
1 2 3 4 |
>>> An error occurred due to zero division >>> |
مدیریت خطای چندتایی
در بالا ما فقط نوع خطای ZeroDivisionError را مدیریت کردیم؛ چون میدانستیم که احتمال بروز چنین خطایی از داخل کدمان وجود دارد! اما اگر احتمال چند نوع مختلف را داشته باشیم، آیا میتوان چندین except پشت سر هم نوشت؟! جواب مثبت است! بصورت زیر:
1 2 3 4 5 6 7 8 |
try: variable = 10 print(variable + "hello") print(variable / 2) except ZeroDivisionError: print("Divided by zero") except (ValueError, TypeError): print("Error occurred") |
در اینجا علاوهبر خطای ZeroDivisionError، خطاهای ValueError و TypeError نیز با یکدیگر بررسی شدهاند! یعنی فرقی ندارد چه ValueError باشد و چهTypeError، یک کد مشترکی اجرا خواهد شد.
خروجی این کد:
1 2 3 |
>>> Error occurred >>> |
مدیریت هر خطایی
شاید اصلا نوع خطا برایمان مهم نیست و از آنجایی که احتمال میدهیم کدمان خطایی داشته باشد، بخواهیم فقط در صورت رخ دادن هر نوع خطایی، آن را مدیریت کنیم. در این صورت نیازی به نوشتن نوع خطا در مقابل except نیست! بصورت زیر:
1 2 3 4 5 |
try: word = "spam" print(word / 0) except: print("An error occurred") |
و خروجی آن بصورت زیر میباشد:
1 2 3 |
>>> An error occurred >>> |
دستور finally در پایتون
برای اینکه در هنگام رخ دادن خطا، مشخص کنیم که بخشی از کد، چه در صورت اجرای صحیح و چه در صورت بروز خطا، حتما اجرا شود، بایستی از finally در هنگام مدیریت خطا استفاده کرد. بصورت زیر:
1 2 3 4 5 6 7 |
try: print("Hello") print(1 / 0) except ZeroDivisionError: print("Divided by zero") finally: print("WWW.FuLLKade.COM") |
و خروجی آن:
1 2 3 4 5 |
>>> Hello Divided by zero WWW.FuLLKade.COM >>> |
بنابراین عبارت «WWW.FuLLKade.COM» چه خطا رخ بدهد و چه ندهد، در هر صورت اجرا خواهد شد.
در درس بعدی یاد خواهیم گرفت که خودمان خطا تولید کنیم! ?
نظرات ثبت شده بدون دیدگاه