Постановка задачи
Исключение (exception) - это аварийное состояние программы, возникшее во время исполнения.
Во время работы программы иногда возникают ситуации, когда выполнять программу нельзя или не имеет смысла:
- синтаксическая ошибка в коде;
- деление на ноль;
- выход за границы списка;
- попытка прочитать несуществующий файл и так далее.
В одном месте проблема проявилась (открытие файла), но реальная ошибка произошла в другом месте (пользователь указал неправильное имя файла), а что-то сделать с этой ситуацией мы можем в третьем месте (в коде диалога с пользователем сказать, что файл не существует и попросить его ввести имя файла еще раз).
Как доставить информацию об ошибке от места ее проявления (функция open) до места ее обработки?
Возвращать из функции ошибку и обрабатывать что вернула функция. Делать это для всей цепочки вызова функций. Это подход языка С. Можно сделать в любом языке.
Создавать объект exception и отправлять его вверх по стеку вызова функций, используя стандартный подход к обработке исключений (exception handling) языка. Так делают в языках python, C++, java и т.п.
Плюсы и минусы этих подходов:
Код прозрачнее; алгоритм не зашумляется многочисленными строками обработки ошибок, которые просто возвращаются дальше по стеку вызова функций.
в нашей функции мы можем вернуть код ошибки, но при ее вызове другой программист может его не обрабатывать, а просто игнорировать. Как часто вы проверяли в языке С, что вернул вызов printf?
Термины
- try
- except
- else
- finally
- raise
try:
try_suite
except exception_group1 as variable1:
except_suite1
…
except exception_groupN as variableN:
except_suiteN
else:
else_suite
finally:
finally_suite