Ошибки и отладка в 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 перед сабмитом: лишний вывод ломает сравнение в тестах.

Что дальше