Постановка задачи

Исключение (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

results matching ""

    No results matching ""