پایتون برای همه | 22 | استفاده از try و except برای استثناها

پایتون برای همه پایتون 3

اشتراک وفاداری

می‌توانید از محتویات این باکس بگذرید و یک‌راست به سراغ نوشته اصلی بروید. قبل از خرید اشتراک وفاداری، مزایای آن را از طریق این پیوند مشاهده کنید. لطفا تنها بعد از خواندن «مزایای خرید اشتراک» اقدام به خرید کنید.

پیشتر یاد گرفتیم که با input از کاربر، ورودی بگیریم و سپس با استفاده از تابع int آن را به عدد صحیح تبدیل کنیم. یادتان می‌آید که ورودی input به عنوان نوع «استرینگ» ذخیره می‌شد. حالا به مثال زیر نگاه کنید:

>>> prompt = "What...is the airspeed velocity of an unladen swallow?n"
>>> speed = input(prompt)
What...is the airspeed velocity of an unladen swallow?
What do you mean, an African or a European swallow?
>>> int(speed)
ValueError: invalid literal for int() with base 10:
>>>

زمانیکه ما در حال اجرای این نمونه گزاره‌ها در حالت تعاملی باشیم، خب خطا را می‌بینیم و مفسر به ادامه‌ی کارش می‌پردازد، ولی در اسکریپت اوضاع فرق می‌کند و برنامه متوقف شده و با نشان دادن یک تریسْ‌بک از انجام گزاره‌ی بعدی باز می‌ماند.

تریس‌ْبک چیست؟ گزارشی که برنامه در خصوص وضعیتش نشان می‌دهد را تریس‌بک می‌گوییم.

به برنامه‌ی زیر که قرار است مقدار فارنهایت را به سانتی‌گراد تبدیل کرده و چاپ نماید، دقت کنید:

inp = input('Enter Fahrenheit Temperature: ')
fahr = float(inp)
cel = (fahr - 32.0) * 5.0 / 9.0
print(cel)


# Code: http://www.py4e.com/code3/fahren.py

اگر ما این کد را اجرا کرده و مقدار غیرمجازی به ورودی بدهیم، با یک پیام نه‌چندان دلچسب، برنامه به کار خود پایان می‌دهد.

python fahren.py
Enter Fahrenheit Temperature:72
22.22222222222222
python fahren.py
Enter Fahrenheit Temperature:fred
Traceback (most recent call last):
  File "fahren.py", line 2, in <module>
    fahr = float(inp)
ValueError: could not convert string to float: 'fred'

برای رفع مشکلِ برخورد به خطاهای «قابل پیش‌بینی» و همچنین «غیرمترقبه» چه کاری می‌توان انجام داد؟ پایتون ساختاری برای مقابله با این حالت‌ها با خود به همراه دارد که به آن except/try می‌گوییم. ایده‌ی try و except چیست؟ زمانی که احساس می‌کنید ممکن است سلسله‌ای از دستورالعمل‌ها در حین اجرا، به مشکل بر بخورند، می‌توانید گزاره‌هایی را تعیین کنید تا آن حالت خاص را مدیریت کنند. این گزاره‌ها که زیر except قرار می‌گیرند، تنها در صورتی اجرا می‌شوند که برنامه به خطا بر بخورد در غیر این صورت پایتون از روی آن‌ها پرش می‌کند.

می‌توانید به try و except به مثابه یک ضمانت‌نامه نگاه کنید. ضمانت اجرای پاره‌ای از کدها.

از آنجایی که بهتر است دست به کار شویم تا درک بهتری از این قابلیت پیدا کنیم، برنامه‌ی بالا را از نو و این بار با try و except بازنویسی می‌کنیم:

inp = input('Enter Fahrenheit Temperature:')
try:
    fahr = float(inp)
    cel = (fahr - 32.0) * 5.0 / 9.0
    print(cel)
except:
    print('Please enter a number')

# Code: http://www.py4e.com/code3/fahren2.py

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

python fahren2.py
Enter Fahrenheit Temperature:72
22.22222222222222
python fahren2.py
Enter Fahrenheit Temperature:fred
Please enter a number

مدیریت استثناها با استفاده از گزاره‌ی try، «گرفتن استثنا» یا catching an exception نامیده می‌شود. در مثال ما بلوک except خطایی را چاپ می‌کند و می‌گوید «لطفا یک عدد وارد کنید». در کل، گرفتن استثنا امکان رفع مشکل را به ما می‌دهد. یا ما را به تصحیح مشکل و تلاش مجدد وا می‌دارد و یا اینکه برنامه را با وقار به پایان می‌رساند.

این نوشته تحت مجوز کرییتیو کامنز BY – NC و حمایت موسسه تحقیقاتی رامونا ارائه می‌شود. شما می‌توانید با توجه به مفاد این گواهی از آن استفاده کنید.

اولین نفری باشید که نظر می‌گذارد

پاسخ دهید

ایمیل شما نمایش داده نخواهد شد