«Результат вызова sys. exc inf о, который применялся в предшествующих двух разделах, дает возможность обработчику исключений получать доступ к самому последнему cгенерированному исключению обобщенным образом. Это особенно полезно при использовании пустой конструкции except для слепого перехвата всех исключений,
чтобы выяснить, какое исключение было сгенерировано:
import sys
try:
...
except:
# sys.exc_info()[0:2] представляет класс и экземпляр исключения
Если никакие исключения не обрабатывались, тогда такой вызов возвращает кортеж с тремя значениями None. В противном случае значениями будут (type, value, traceback):
— type — класс обрабатываемого исключения;
— value — экземпляр класса исключения, который был сгенерирован;
— traceback — объект трассировки, который представляет стек вызовов в месте,
где первоначально возникло исключение, и применяется модулем traceback для генерации сообщений об ошибках».
👍2❤1👎1
❤1👍1👎1
«В коде используется удобная функция `print_exc` из модуля `traceback`, которая по умолчанию потребляет данные `sys.exc_info`»
Исключение уже было перехвачено блоком except Exception. Когда происходит деление на ноль в функции inverse(0), Python генерирует `ZeroDivisionError`, но этот блок except перехватывает исключение и предотвращает его дальнейшее распространение.
После перехвата исключения:
1. `traceback.print_exc(file=open('badly.exc', 'w'))` - записывает информацию об ошибке в файл `badly.exc`
2. `print('Bye')` - выполняется нормально, так как исключение уже обработано
«traceback.print_exc() потребляет данные sys.exc_info - это означает, что функция извлекает информацию о последнем исключении и форматирует её для вывода, но не прерывает выполнение программы.
❤1👍1👎1
👍2💩2👎1
Использование пустой конструкции except может привести к серьезным проблемам:
«Программист здесь предполагает, что единственным видом ошибок, которые могут произойти при индексировании словаря, будет отсутствующий ключ. Но поскольку имя myditctionary написано неправильно (должно быть mydictionary), интерпретатор Python взамен генерирует исключение NameError для ссылки на неопределенное имя, которое обработчик молча перехватывает и игнорирует».
Что происходит в коде:
— Переменная mydictionary определена корректно;
— В блоке try используется неправильное имя myditctionary (с опечаткой);
— Это вызывает NameError, а не ожидаемый KeyError;
— Пустой except перехватывает любую ошибку, включая NameError;
— Программа продолжает выполнение, маскируя реальную проблему.
«В качестве эмпирического правила: будьте в своих обработчиках как можно более конкретными — пустые конструкции except и перехват суперкласса Exception удобны, но потенциально подвержены ошибкам».
👍3👎1