مدیریت خطا با try-except-finally

Please login to bookmark Close

مدیریت خطا با 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 کارهای پایانی را تضمین می‌کنید.

برای مطالعه‌ی بیشتر می‌توانید به مستندات رسمی پایتون سر بزنید.

این درس بخشی از دوره آموزش پایتون مقدماتی است.

Please login to bookmark Close
پیشرفت شما در «دوره آموزش پایتون مقدماتی» (38%)
نظرات

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

38%
پیشرفت

سرفصل دوره

فهرست مطالب

سرفصل دوره

تمرین

این قسمت تمرین ندارد!

پاسخ تمرین ها

هنوز برای تمرین‌های این قسمت پاسخی ثبت نشده است!

اشتراک گذاری

چرا بهتره از فیلترشکن استفاده کنید؟

من همه ویدئو ها و پادکست های کُدباز رو توی یوتیوب و ساندکلود و پلتفرم هایی آپلود می‌کنم که اغلب فیلتر هستند.

اغلب آموزش‌ها ویدئو و پادکست دارند. پس اگر می‌خواهید از محتوای سایت بیشترین استفاده رو ببرید نیاز به فیلتر شکن دارید.

توجه داشته باشید که برای خرید از فروشگاه بهتره فیلتر شکن رو خاموش کنید.

تنظیمات

انتخاب زبان
تغییر تم