Механизм обработки исключений предлагает практически любой язык программирования. В этой статье мы рассмотрим реализацию обработки исключений в языке Python.
Прежде всего, так как Python является интерпретируемым языком программирования полностью критичными для него являются синтаксические ошибки - SyntaxError. Это ошибки при которых ваш код элементарно не выполнится интерпретатором потому что вы нарушили правила написания кода:
Как видно в случае ошибки синтаксиса интерпретатор явно показывает нам название файла и строку где мы допустили синтаксическую ошибку. Но такие ошибки особого интереса для нас не представляют, хотя бы потому что сделать с ними можно только одно - исправить.
Нас же интересует другая группа ошибок, которые называются исключениями или Exceptions. В общем виде это ошибки которые происходят во время выполнения когда, например такое.
И тут может возникнуть вопрос в чем же разница между этими ошибками? Продемонстрирую разницу между ними на примере, и между делом продемонстрирую конструкцию try except.
Как видно из примера у нас получилось изменить поведение блока с ошибкой деления на ноль, но не получилось сделать это с блоком синтаксической ошибки. Но что же мы сделали? А выполнили мы обработку исключений. Между ключевыми словами try и except помещается блок кода который мы хотим попробовать выполнить, и, если возникнет исключение, перехватить и выполнить что-то другое.
Однако, что произойдет если в блоке кода возникнет несколько исключений? В данном случае поведение никак не изменится так как мы не уточнили какой именно тип исключения хотим перехватывать. Давайте дополним нашу конструкцию конкретным типом исключения и убедимся что она сработает правильно добавив ещё кода.
Здесь важно обратить внимание на вывод сообщений. Так как когда выполняется сверху вниз, то мы видим что сначала выполнилась строка перед делением на ноль, а потом сразу вывелось сообщение что делить на ноль нельзя, таким образом код ниже исключения выполнен не будет.
А что если случится непредусмотренное исключение выше по коду?
Видно что программа падает как только попадает на ошибку выше, и выполнение кода полностью прекращается. В данном случае мы можем использовать каскад исключений.
В данном случае мы обработали ошибку когда пытались использовать переменную b которой не было объявлено выше. Остановка внутри блока try except произошла на строке с несуществующей переменной b, после чего выполнился код относящийся к этому исключению (NameError) и программа продолжила свою работу.
Спасбо за внимание!