مدیریت خطا (try-except)
چرا لازمه؟
- اگه ورودی/داده با نوع اشتباه وارد یک محاسبه بشه (مثلاً غیرعددی بهجای عدد)، مفسر پایتون اجرای برنامه رو قطع میکنه
- برای جلوگیری از کرش کردن برنامه، از
try-exceptاستفاده میشه
نحوه کار
- کد داخل
tryاجرا میشه - اگه بدون خطا تموم بشه → بلوک
exceptنادیده گرفته میشه - اگه استثنا (exception) رخ بده → اجرا از
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')- اگه کاربر عدد وارد کنه → تبدیل و محاسبه انجام میشه
- اگه کاربر متن غیرعددی وارد کنه →
float(inp)خطا میده → پیام'Please enter a number'چاپ میشه بهجای کرش کردن برنامه
مدیریت خطاهای مشخص و نامشخص
try:
number = int(input('Enter a number: '))
print(10 / number)
except ValueError:
print('That is not a valid number')
except ZeroDivisionError:
print('You cannot divide by zero')
except Exception as e:
print('Error:', str(e))خطاهای رایج (Common Errors)
| دسته | زمان بروز | مثال |
|---|---|---|
| خطای نحوی (Syntax) | قبل از اجرا، حین خوندن کد | فراموش کردن : |
| خطای زمان اجرا (Runtime) | حین اجرای کد | تقسیم بر صفر |
| خطای منطقی (Logical) | کد اجرا میشه ولی نتیجه غلطه | خطا نمیده، باید خودمون پیدا کنیم |
SyntaxError
- ساختار کد با قواعد پایتون نمیخونه، اصلاً اجرا نمیشه
if True
print('hello')SyntaxError: expected ':'
IndentationError
- تورفتگی (فاصلهگذاری ابتدای خط) رعایت نشده
if True:
print('hello')IndentationError: expected an indented block
NameError
- استفاده از متغیر یا نامی که تعریف نشده
print(age)NameError: name 'age' is not defined
TypeError
- عملیات روی نوعهای دادهی ناسازگار
result = '5' + 5TypeError: can only concatenate str (not "int") to str
ValueError
- نوع داده درسته ولی مقدارش برای عملیات مناسب نیست
number = int('abc')ValueError: invalid literal for int() with base 10: 'abc'
IndexError
- دسترسی به اندیسی خارج از محدودهی لیست یا رشته
nums = [1, 2, 3]
print(nums[5])IndexError: list index out of range
KeyError
- دسترسی به کلیدی که در دیکشنری وجود نداره
person = {'name': 'Sara'}
print(person['age'])KeyError: 'age'
AttributeError
- صدا زدن متد یا ویژگیای که برای اون نوع داده وجود نداره
number = 5
number.append(1)AttributeError: 'int' object has no attribute 'append'
ZeroDivisionError
- تقسیم هر عددی بر صفر
result = 10 / 0ZeroDivisionError: division by zero
خواندن پیام خطا (Traceback)
- آخرین خط پیام خطا، نوع خطا و دلیل رو نشون میده
- خطهای بالاتر، مسیر اجرای کد تا رسیدن به خطا رو نشون میدن (از بیرونیترین تا خط دقیق خطا)