جلسه سی و هفتم

حل نمونه سوال کنترل خطاها و استثنائات

				
					مثال 1: برنامه تقسیم دو عدد بنویس (با کنترل خطای تقسیم بر صفر).
print("Enter two numbers. I'll divide them.")
x = input("First number: ")
y = input("Second number: ")
try:
    result = int(x) / int(y)
except ZeroDivisionError:
    print("You can't divide by zero!")
else:
    print(result)
				
			

مثال 2: برنامه تقسیم دو عدد بنویس تا زمانی که کاربر عبارت q را وارد کند(با کنترل خطای تقسیم بر صفر).

				
					
print("Enter two numbers. I'll divide them.")
print("Enter 'q' to quit.")
while True:
    x = input("nFirst number: ")
    if x == 'q':
        break
    y = input("Second number: ")
    if y == 'q':
        break
    try:
        result = int(x) / int(y)
    except ZeroDivisionError:
        print("You can't divide by zero!")
    else:
        print(result)
				
			

این برنامه یک ماشین حساب ساده است که امکان تقسیم دو عدد را به کاربر می‌دهد. برنامه به شرح زیر کار می‌کند:

1. در ابتدا، برنامه پیغامی را چاپ می‌کند که از کاربر می‌خواهد دو عدد وارد کند و اطلاع می‌دهد که کاربر می‌تواند با تایپ حرف ‘q’ از برنامه خارج شود.

2. برنامه سپس وارد یک حلقه `while True` می‌شود که تا زمانی که کاربر ‘q’ را وارد نکرده است، به اجرای خود ادامه می‌دهد.

3. در هر تکرار حلقه، برنامه از کاربر دو عدد را دریافت می‌کند. اگر کاربر ‘q’ را وارد کند، حلقه با استفاده از دستور `break` متوقف می‌شود.

4. پس از دریافت دو عدد، برنامه تلاش می‌کند آن‌ها را به اعداد صحیح تبدیل کند و سپس آن‌ها را تقسیم کند.

5. اگر در این فرآیند خطای `ZeroDivisionError` رخ دهد (تلاش برای تقسیم بر صفر)، برنامه پیغام مربوطه را چاپ می‌کند.

6. در صورت عدم بروز خطا، نتیجه تقسیم چاپ می‌شود.

این برنامه به کاربر امکان می‌دهد تا به طور مداوم دو عدد را وارد کرده و آن‌ها را تقسیم کند. همچنین با استفاده از حرف ‘q’، کاربر می‌تواند به راحتی از برنامه خارج شود.

تصمیم گیری برای گزارش کدام خطاها:

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

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

گاهی اوقات شما می خواهید برنامه شما در صورت مواجهه با خطا، بدون گزارش خطا به کاربر، به اجرا ادامه دهد. استفاده از عبارت pass در یک بلوک else به شما این امکان را می دهد.

مثال 3: استفاده از عبارت pass در بلوک else

				
					f_names = ['alice.txt', 'siddhartha.txt','moby_dick.txt', 'little_women.txt']
for f_name in f_names:
    # Report the length of each file found.
    try:
        with open(f_name) as f_obj:
            lines = f_obj.readlines()
    except FileNotFoundError:
        # Just move on to the next file.
        pass
    else:
        num_lines = len(lines)
        msg = "{0} has {1} lines.".format(
        f_name, num_lines)
        print(msg)
				
			

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

اگر می‌خواهید از یک بلوک try استفاده کنید و مطمئن نیستید که کدام استثنا را بگیرید، از Exception استفاده کنید. اکثر استثناها را می گیرد، اما همچنان به شما اجازه می دهد برنامه ها را عمداً قطع کنید.

1.از بلوک‌های خالی except استفاده نکنید

				
					try:
    # Do something
except:
    pass
				
			

2. به جای آن از Exception استفاده کنید

				
					try:
    # Do something
except Exception:
    pass
				
			

3. چاپ استثنا(هنگامی که نوع ارورمان را نمیدانیم.)

				
					try:
    # Do something
except Exception as e:
    print(e, type(e))