تبلیغات

دوره H پایتون – فصل 4: استثناها و فایلها – درس 1: مدیریت استثناها (خطاها)

دوره H پایتون

دوره H برنامه نویسی پایتون
فصل چهارم: استثناها و فایل ها در پایتون
درس اول: مدیریت استثناها (خطاها) در پایتون


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

به فصل 4 خوش آمدید! فصلی که در آن با استثنا (Exception)ها و یا خطاها سر و کار خواهیم داشت تا بتوانیم آنها را مدیریت و هندل کنیم.

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

  1. چگونه بفهمیم که خطا رخ داده و از متوقف شدن برنامه جلوگیری کنیم؟!
  2. چگونه جلوی اتفاق افتادن خطا را بگیریم؟!

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

ایجاد یک خطا

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

نتیجه چه خواهد شد؟!

بله خطا رخ داد! خطای ZeroDivisionError! ?

باید توجه داشته باشید که خطاهای مختلف، بخاطر دلایل مختلفی رخ می‌دهند؛ که از مرسوم‌ترین خطاها، می‌توان به موارد زیر اشاره کرد:

  • ImportError: یک ایمپورت ماژول ناموفق
  • IndexError: یک لیست که مثلا به ایندکس نامعتبر و خارج از محدوده‌ی آن دسترسی داشته‌ایم
  • NameError: استفاده از یک متغیر ناشناخته
  • SyntaxError: خطا در سینتکس کد نوشته شده
  • TypeError: مثلا یک تابع با یک مقدار از نوع نامناسب فراخوانی شده است
  • ValueError: مثلا یک تابع با یک مقدار از نوع مناسب فراخوانی شده است؛ اما مقدرا آن مناسب نیست!
نکته

پایتون شامل استثنائات مختلف دیگری نیز در داخل خود و بصورت built-in است. مانند ZeroDivisionError  که در بالا اشاره شد. یا OSError و …

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

مدیریت خطا در پایتون

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

برای مثال:

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

خروجی این کد بصورت زیر است:

مدیریت خطای چندتایی

در بالا ما فقط نوع خطای ZeroDivisionError را مدیریت کردیم؛ چون می‌دانستیم که احتمال بروز چنین خطایی از داخل کدمان وجود دارد! اما اگر احتمال چند نوع مختلف را داشته باشیم، آیا می‌توان چندین except پشت سر هم نوشت؟! جواب مثبت است! بصورت زیر:

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

خروجی این کد:

مدیریت هر خطایی

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

و خروجی آن بصورت زیر می‌باشد:

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

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

برای اینکه در هنگام رخ دادن خطا، مشخص کنیم که بخشی از کد، چه در صورت اجرای صحیح و چه در صورت بروز خطا، حتما اجرا شود، بایستی از finally در هنگام مدیریت خطا استفاده کرد. بصورت زیر:

و خروجی آن:

بنابراین عبارت «WWW.FuLLKade.COM» چه خطا رخ بدهد و چه ندهد، در هر صورت اجرا خواهد شد.

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

در درس بعدی یاد خواهیم گرفت که خودمان خطا تولید کنیم! ?

درس بعدیدرس قبلی
تبلیغات
0
کانال تلگرام فول کده
تبلیغات

درباره نویسنده

هادی اکبرزاده

[ مدیر فول کده ]

علاقه‌مند به اشتراک گذاری اطلاعات در هر زمینه‌ای / برنامه‌نویس و دانشجوی ارشد رشته شبیه‌ساز هوشمند - در حال نوشتن یه رمان (اگه خدا بخواد و تموم شه ?)

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

نظرات ثبت شده بدون دیدگاه