مدیریت خطا با try-except
در واقع، در این درس مدیریت خطا با try-except را از پایه و با مثال یاد میگیرید.
بنابراین فرض کنید در یک برنامه کاربر باید سن خود را وارد کند اما اشتباهی نامش را وارد میکند. در اینصورت برنامه خطا خواهد داد و ما نیز کنترلی روی رفتار کاربر نداشته ایم.
همچنین، مدیریت خطا یعنی راهی پیدا کنیم تا سناریو هایی که خارج از کنترل ماست و برنامه را دچار خطا میکنند کنترل کنیم.
ساختار try و except
به این ترتیب، قسمتی از کد که خارج از کنترل ماست و ممکن است خطا دهد را در بلاک try تعریف میکنیم.
try:
age = int(input("سن شما: "))
print("سال تولد شما:", 1404 - age)
except ValueError:
print("لطفاً فقط عدد وارد کنید")علاوه بر این، پایتون بلوک try را اجرا میکند. اگر همهچیز خوب پیش برود، except اصلاً اجرا نمیشود. اگر خطایی رخ دهد، به جای توقف برنامه، بلوک except اجرا میشود.
┌────────────────┐
│ بلوک try │
└───────┬────────┘
│
خطا نداد │ خطا داد
┌─────────┴─────────┐
▼ ▼
┌───────────┐ ┌──────────────┐
│ except │ │ ادامه │
└─────┬─────┘ └───────┬──────┘
└───────┬────────┘
▼
│ بلوک finally │
▼
ادامهی برنامه
چند نوع خطای متفاوت
try:
a = int(input("عدد اول: "))
b = int(input("عدد دوم: "))
print(a / b)
except ValueError:
print("فقط عدد وارد کنید")
except ZeroDivisionError:
print("تقسیم بر صفر ممکن نیست")در نهایت، هر خطا در پایتون یک نام دارد. تا اینجای دوره با چندتایشان آشنا شدهاید: ValueError، TypeError، IndexError، KeyError، NameError.
در واقع، با نوشتن نام هریک از این خطا ها جلوی except مشخص میکنید که اگر خطا از این نوب بود، بلاک کد زیر آن اجرا شود.
دیدن پیام خطا
بنابراین میتوانید خطایی که رخ داده را با دستور as error بگیرید و پیامش را چاپ کنید.
try:
print(int("سلام"))
except ValueError as error:
print("خطا رخ داد:", error)خطا رخ داد: invalid literal for int() with base 10: 'سلام'
بلوک finally
هر چیزی که در finally باشد، در هر صورت اجرا میشود. چه خطا رخ دهد چه ندهد.
try:
print(10 / 0)
except ZeroDivisionError:
print("خطای تقسیم")
finally:
print("این خط همیشه اجرا میشود")کاربرد واقعیاش برای بستن چیزهایی است که باز کردهاید: فایل، اتصال دیتابیس، اتصال شبکه. اینها باید بسته شوند، حتی اگر وسط کار خطایی رخ داده باشد.
اشتباهات رایج
گرفتن همهی خطاها
try:
do_something()
except:
passاگر نوع خطا را جلوی except مشخص نکنید و داخل بلاک آن نیز از pass استفاده کنید، هر خطایی که رخ بدهد هیچ اتفاقی نمیافتد و این بخش از کد به صورت سایلنت رد خواهد شد.
معمولا برنامه نویسان تازه کار که ایده ای برای سناریو های گوناگون برنامه در حالت خطا ندارند، بدون توجه به اینکه چقدر این کار خطرناک است، این کار را میکنند.
بزرگ گرفتن بلوک try
هرچه داخل try کمتر باشد بهتر است. اگر بیست خط کد را داخلش بگذارید، وقتی ValueError گرفتید نمیدانید از کدام خط آمده و پیدا کردنش دشوار تر است.
جمعبندی
با try کدی را که ممکن است خطا بدهد جدا میکنید، با except برای هر نوع خطا تصمیم میگیرید، و با finally کارهای پایانی را تضمین میکنید.
برای مطالعهی بیشتر میتوانید به مستندات رسمی پایتون سر بزنید.
این درس بخشی از دوره آموزش پایتون مقدماتی است.