Ошибки и отладка в Python
Что означает трейсбек, как поймать исключение и чем отличаются частые ошибки.
Как читать traceback
Traceback (most recent call last):
File "main.py", line 4, in <module>
print(total(199, '3'))
File "main.py", line 2, in total
return price + qty
TypeError: unsupported operand type(s) for +: 'int' and 'str' Читай снизу вверх: последняя строка — тип ошибки и причина, строки выше — путь до места падения, твой код обычно в нижней из File-строк. Тип плюс текст ошибки — готовый запрос для поиска по этому справочнику.
Частые ошибки: что значат
199 + '3' # TypeError: mixing int and str
items[10] # IndexError: index out of range
stock['x'] # KeyError: no such key
prnit('hi') # NameError: name is not defined
int('12a') # ValueError: bad value for int() TypeError — смешал типы (чинится через int()/str()); IndexError и KeyError — обращение к тому, чего нет; NameError — опечатка в имени. Название ошибки говорит, куда смотреть, точную строку показывает traceback.
try/except: перехват ошибки
raw = 'abc'
try:
value = int(raw)
except ValueError:
value = 0
print(value) # 0 Код в try выполняется до первой ошибки, except подхватывает её и идёт по запасному пути. Указывай конкретный тип: голый except прячет настоящие баги.
raise: выбросить ошибку
def set_price(price):
if price < 0:
raise ValueError('price must be >= 0')
return price
set_price(-5) # ValueError: price must be >= 0 raise останавливает функцию и отдаёт ошибку наверх — вызывающий код решит, ловить её или падать. Плохие входные данные лучше отклонить сразу, чем вернуть «тихий» None.
Отладка print’ом
def apply_discount(price, percent):
print('price:', price, 'percent:', percent)
result = price * (1 - percent / 100)
print('result:', result)
return result
apply_discount(200, 15) # result: 170.0 Печатай подпись и значение на входе функции и перед return — сразу видно, где данные разошлись с ожиданием. Убери отладочные print перед сабмитом: лишний вывод ломает сравнение в тестах.