Перейти к содержимому

Try python что это

  • автор:

Что такое try except в Python?

Исключения это то, что может непредвиденно возникнуть в ходе работы программы. Если такое случиться, то программа просто перестанет работать или же вовсе выключиться. Чтобы такого не допустить вам всегда стоит добавлять исключения при работе с различными вещами.

К примеру, вы хотите добавить возможность деления двух чисел? Добавьте исключение, которое позволит проверять, не является ли делитель нулем.

А может вы хотите что-то вписать файл? Пропишите исключение, которое будет срабатывать если файл не найден, чтобы программа не пыталась открывать файл повторно. Чтобы ознакомиться детальнее со всеми возможными классами исключений вы можете посетить эту страницу , где приведены все возможные ошибки.

Конструкция самих исключений очень проста. Необходимо сперва попробовать что-то сделать, а позже искать ошибку. Если она будет найдена, то сработает код из блока except, иначе все сработает корректно и никаких ошибок не будет.

try: # Пробуем что-то сделать k = 1 / 0 # Деление на ноль except ArithmeticError: # Отслеживаем на арифметическую ошибку print ("Найдена ошибка") # Мы нашли ошибку k = 0 # Наша переменная теперь будет равна 0 print(k) # Просто выводим переменную

Исключения в python. Конструкция try — except для обработки исключений

Python 3 логотип

Исключения (exceptions) — ещё один тип данных в python. Исключения необходимы для того, чтобы сообщать программисту об ошибках.

Самый простейший пример исключения — деление на ноль:

Разберём это сообщение подробнее: интерпретатор нам сообщает о том, что он поймал исключение и напечатал информацию (Traceback (most recent call last)).

Далее имя файла (File «»). Имя пустое, потому что мы находимся в интерактивном режиме, строка в файле (line 1);

Выражение, в котором произошла ошибка (100 / 0).

Название исключения (ZeroDivisionError) и краткое описание исключения (division by zero).

Разумеется, возможны и другие исключения:

В этих двух примерах генерируются исключения TypeError и ValueError соответственно. Подсказки дают нам полную информацию о том, где порождено исключение, и с чем оно связано.

Рассмотрим иерархию встроенных в python исключений, хотя иногда вам могут встретиться и другие, так как программисты могут создавать собственные исключения. Данный список актуален для python 3.3, в более ранних версиях есть незначительные изменения.

  • BaseException — базовое исключение, от которого берут начало все остальные.
    • SystemExit — исключение, порождаемое функцией sys.exit при выходе из программы.
    • KeyboardInterrupt — порождается при прерывании программы пользователем (обычно сочетанием клавиш Ctrl+C).
    • GeneratorExit — порождается при вызове метода close объекта generator.
    • Exception — а вот тут уже заканчиваются полностью системные исключения (которые лучше не трогать) и начинаются обыкновенные, с которыми можно работать.
      • StopIteration — порождается встроенной функцией next, если в итераторе больше нет элементов.
      • ArithmeticError — арифметическая ошибка.
        • FloatingPointError — порождается при неудачном выполнении операции с плавающей запятой. На практике встречается нечасто.
        • OverflowError — возникает, когда результат арифметической операции слишком велик для представления. Не появляется при обычной работе с целыми числами (так как python поддерживает длинные числа), но может возникать в некоторых других случаях.
        • ZeroDivisionError — деление на ноль.
        • IndexError — индекс не входит в диапазон элементов.
        • KeyError — несуществующий ключ (в словаре, множестве или другом объекте).
        • UnboundLocalError — сделана ссылка на локальную переменную в функции, но переменная не определена ранее.
        • BlockingIOError
        • ChildProcessError — неудача при операции с дочерним процессом.
        • ConnectionError — базовый класс для исключений, связанных с подключениями.
          • BrokenPipeError
          • ConnectionAbortedError
          • ConnectionRefusedError
          • ConnectionResetError
          • IndentationError — неправильные отступы.
            • TabError — смешивание в отступах табуляции и пробелов.
            • UnicodeEncodeError — исключение, связанное с кодированием unicode.
            • UnicodeDecodeError — исключение, связанное с декодированием unicode.
            • UnicodeTranslateError — исключение, связанное с переводом unicode.

            Теперь, зная, когда и при каких обстоятельствах могут возникнуть исключения, мы можем их обрабатывать. Для обработки исключений используется конструкция try — except.

            Первый пример применения этой конструкции:

              
            
              
            

            Ещё две инструкции, относящиеся к нашей проблеме, это finally и else. Finally выполняет блок инструкций в любом случае, было ли исключение, или нет (применима, когда нужно непременно что-то сделать, к примеру, закрыть файл). Инструкция else выполняется в том случае, если исключения не было.

            Для вставки кода на Python в комментарий заключайте его в теги

            Обработка/перехват исключений try/except в Python

            Можно писать программы, которые обрабатывают выбранные исключения. Посмотрите на следующий пример, который запрашивает ввод у пользователя до тех пор, пока не будет введено правильное целое число, но позволяет пользователю прерывать программу, используя Ctrl-C или что-либо поддерживаемое операционной системой. Обратите внимание, что сгенерированное пользователем прерывание сигнализируется возбуждением исключения KeyboardInterrupt .

            while True: try: x = int(input("Пожалуйста, введите целое число: ")) break except ValueError: print("Это не целое число. Попробуйте снова. ") 

            Оператор try/except работает следующим образом:

            • Сначала выполняется инструкция try - код между ключевыми словами try и except .
            • Если исключение не возникает, инструкция except пропускается и выполнение оператора try завершается.
            • Если во время выполнения кода в инструкции try возникает исключение, остальная часть кода этого блока пропускается. Затем, если тип исключения соответствует исключению, записанному после ключевого слова except , блок кода этой инструкции except выполняется, а затем выполнение программы продолжается после всей конструкции try .
            • Если возникает исключение, которое не соответствует исключению, записанному в инструкции except , оно передается внешним операторам try . Если обработчик не найден, то это считается необработанным исключением, следовательно выполнение останавливается с сообщением об ошибке выполнения.

            Оператор try может содержать несколько инструкций except , чтобы указать обработчики для различных исключений. В этом случае будет выполнен только один обработчик. Обработчики обрабатывают исключения, возникающие только в соответствующей конструкции try , а не в других обработчиках, например вложенных, того же оператора try . Инструкция except может иметь несколько исключений в виде кортежа, заключенного в скобки, например:

            except (RuntimeError, TypeError, NameError): pass 

            Класс в инструкции except совместим с исключением, если это тот же самый класс или его базовый класс, но не наоборот. Инструкция except , перечисляющая производный класс, не совместима с базовым классом. Например, следующий код будет печатать B , C , D в таком порядке:

            class B(Exception): pass class C(B): pass class D(C): pass for cls in [B, C, D]: try: raise cls() except D: print('D') except C: print('C') except B: print('B') 

            Обратите внимание, что если бы инструкции except были отменены (с первым исключением B), то вывелось бы B , B , B - срабатывает первое совпадающее предложение except .

            Последняя инструкция except может опустить имя исключения. Используйте это с крайней осторожностью, таким образом можно легко замаскировать реальную ошибку программирования! Здесь можно использовать sys.exc_info() или модуль traceback для вывода сообщения об ошибке или ее сохранения для дельнейшего анализа, а затем повторно вызвать исключение при помощи оператора raise , что позволяет вызывающей стороне также обработать исключение:

            import traceback try: f = open('myfile.txt') s = f.readline() i = int(s.strip()) except OSError as err: print("OS error: ".format(err)) except ValueError: print("Не удалось преобразовать данные в целое число.") except: print("Непредвиденная ошибка. ") # сохраняем исключение для дальнейшего анализа. with open('trace.txt', 'a') as fp: traceback.print_exc(file=fp) # повторный вызов исключения, если это необходимо. raise 

            В примере выше, сведения об ошибке сохраняются в файл trace.txt с использованием встроенной функции open() . Лучшей практикой сохранения исключений для дальнейшего анализа в подобных ситуациях является применение модуля logging .

            Конструкция try/except может содержать необязательную инструкцию else , которая при наличии должна следовать за всеми инструкциями except . Блок кода в инструкции else будет выполнен в том случае, если код в инструкции try не вызывает исключения. Например:

            for arg in sys.argv[1:]: try: f = open(arg, 'r') except OSError: print('не удается открыть', arg) else: print(arg, 'имеет', len(f.readlines()), 'строк') f.close() 

            Использование инструкции else лучше, чем добавление дополнительного кода в инструкцию try , поскольку позволяет избежать случайного перехвата исключения, которое не было вызвано кодом, защищенным конструкцией try/except .

            Когда возникает исключение, оно может иметь связанное значение, также известное как аргумент исключения. Наличие и тип аргумента зависят от типа исключения.

            Инструкция except может указывать переменную после имени исключения. Переменная привязывается к экземпляру исключения с аргументами, хранящимися в экземпляре instance.args . Для удобства, экземпляр исключения определяет __str__() , так что аргументы могут быть напечатаны непосредственно без необходимости ссылаться instance.args . Кроме того, можно создать экземпляр исключения прежде, чем вызвать его и добавить любые атрибуты к нему по желанию.

            try: raise Exception('spam', 'eggs') except Exception as inst: # экземпляр исключения print(type(inst)) # аргументы, хранящиеся внутри print(inst.args) # __str__ позволяет печатать args напрямую, но может # быть переопределен в подклассах исключений print(inst) # распаковка аргументов x, y = inst.args print('x =', x) print('y =', y) # # ('spam', 'eggs') # ('spam', 'eggs') # x = spam # y = eggs 

            Если исключение имеет аргументы, они печатаются как последняя часть ("деталь") сообщения для необработанных исключений.

            Обработчики исключений обрабатывают не только исключения возникающие непосредственно в предложении try , но также если они возникают внутри функций, которые вызываются, даже косвенно, в коде оператора try . Например:

            def this_fails(): x = 1/0 try: this_fails() except ZeroDivisionError as err: print('Handling run-time error:', err) #Handling run-time error: division by zero 
            • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
            • Обработка/перехват исключений try/except
            • Инструкция finally, очистка внешних ресурсов
            • Тонкости работы конструкции try/except/else/finally
            • Создание пользовательского класса исключения
            • Обработка группы исключений, оператор except*
            • Эффективная обработка исключений
            • Инструкция raise, принудительный вызов исключений
            • Отладочные утверждение assert
            • Улучшения сообщений об ошибках 3.10
            • Улучшения сообщений об ошибках 3.11
            • Улучшения сообщений об ошибках 3.12

            Обработка исключений Python — блок Try/Except, блок Finally

            В этом материале речь пойдет о блоках try/except , finally и raise . Вместе с тем будет рассмотрено, как создавать собственные исключения в Python.

            2. Обработка исключений в Python

            Рассмотрим разные типы исключений в Python, которые появляются при срабатывании исключения в коде Python.

            3. Блоки try/except

            Если код может привести к исключению, его лучше заключить в блок try . Рассмотрим на примере.

            try: for i in range(3): print(3/i) except: print("Деление на 0") print("Исключение было обработано") 

            Программа вывела сообщение, потому что было обработано исключение.

            Следом идет блок except . Если не определить тип исключения, то он будет перехватывать любые. Другими словами, это общий обработчик исключений.

            Если код в блоке try приводит к исключению, интерпретатор ищет блок except , который указан следом. Оставшаяся часть кода в try исполнена не будет.

            Исключения Python особенно полезны, если программа работает с вводом пользователя, ведь никогда нельзя знать, что он может ввести.

            a. Несколько except в Python

            У одного блока try может быть несколько блоков except . Рассмотрим примеры с несколькими вариантами обработки.

            a, b = 1, 0 try: print(a/b) print("Это не будет напечатано") print('10'+10) except TypeError: print("Вы сложили значения несовместимых типов") except ZeroDivisionError: print("Деление на 0") 

            Когда интерпретатор обнаруживает исключение, он проверяет блоки except соответствующего блока try . В них может быть объявлено, какие типы исключений они обрабатывают. Если интерпретатор находит соответствующее исключение, он исполняет этот блок except .

            В первом примере первая инструкция приводит к ZeroDivisionError . Эта ошибка обрабатывается в блоке except , но инструкции в try после первой не исполняются. Так происходит из-за того, что после первого исключения дальнейшие инструкции просто пропускаются. И если подходящий или общий блоки except не удается найти, исключение не обрабатывается. В таком случае оставшаяся часть программы не будет запущена. Но если обработать исключение, то код после блоков except и finally исполнится. Попробуем.

            a, b = 1, 0 try: print(a/b) except: print("Вы не можете разделить на 0") print("Будет ли это напечатано?") 
            Вы не можете разделить на 0 Будет ли это напечатано? 

            b. Несколько исключений в одном except

            Можно использовать один блок except для обработки нескольких исключений. Для этого используются скобки. Без них интерпретатор вернет синтаксическую ошибку.

            try: print('10'+10) print(1/0) except (TypeError,ZeroDivisionError): print("Неверный ввод") 
            Неверный ввод 

            c. Общий except после всех блоков except

            В конце концов, завершить все отдельные блоки except можно одним общим. Он используется для обработки всех исключений, которые не были перехвачены отдельными except .

            try: print('1'+1) print(sum) print(1/0) except NameError: print("sum не существует") except ZeroDivisionError: print("Вы не можете разделить на 0") except: print("Что-то пошло не так. ") 
            Что-то пошло не так. 

            Здесь первая инструкция блока пытается осуществить операцию конкатенации строки python с числом. Это приводит к ошибке TypeError . Как только интерпретатор сталкивается с этой проблемой, он проверяет соответствующий блок except , который ее обработает.

            Отдельную инструкцию нельзя разместить между блоками try и except .

            try: print("1") print("2") except: print("3") 

            Это приведет к синтаксической ошибке.

            Но может быть только один общий или блок по умолчанию типа except . Следующий код вызовет ошибку «default 'except:' must be last» :

            try: print(1/0) except: raise except: print("Исключение поймано") finally: print("Хорошо") print("Пока") 

            4. Блок finally в Python

            После последнего блока except можно добавить блок finally . Он исполняет инструкции при любых условиях.

            try: print(1/0) except ValueError: print("Это ошибка значения") finally: print("Это будет напечатано в любом случае.") 
            Это будет напечатано в любом случае. Traceback (most recent call last): File “”, line 2, in print(1/0) ZeroDivisionError: division by zero 

            Стоит обратить внимание, что сообщение с ошибкой выводится после исполнения блока finally . Почему же тогда просто не использовать print ? Но как видно по последнему примеру, блок finally запускается даже в том случае, если перехватить исключение не удается.

            А что будет, если исключение перехватывается в except ?

            try: print(1/0) except ZeroDivisionError: print(2/0) finally: print("Ничего не происходит") 
            Ничего не происходит Traceback (most recent call last): File "", line 2, in print(1/0) ZeroDivisionError: division by zero During handling of the above exception, another exception occurred: Traceback (most recent call last): File "", line 4, in print(2/0) ZeroDivisionError: division by zero 

            Как видите, код в блоке finally исполняется в любом случае.

            5. Ключевое слово raise в Python

            Иногда нужно будет разбираться с проблемами с помощью вызова исключения. Обычная инструкция print тут не сработает.

            raise ZeroDivisionError 
            Traceback (most recent call last): File "", line 1, in raise ZeroDivisionError ZeroDivisionError 

            Разберемся на примере операции деления:

            a,b=int(input()),int(input()) # вводим 1 затем 0 if b==0: raise ZeroDivisionError 
            Traceback (most recent call last): File "", line 3, in raise ZeroDivisionError ZeroDivisionError 

            Здесь ввод пользователя в переменные a и b конвертируется в целые числа. Затем проверяется, равна ли b нулю. Если да, то вызывается ZeroDivisionError .

            Что будет, если то же самое добавить в блоки try-except? Добавим следующее в код. Если запустить его, ввести 1 и 0, будет следующий вывод:

            a,b=int(input()),int(input()) try: if b==0: raise ZeroDivisionError except: print("Деление на 0") print("Будет ли это напечатано?") 
            1 0 Деление на 0 Будет ли это напечатано? 

            Рассмотрим еще несколько примеров, прежде чем двигаться дальше:

            raise KeyError 
            Traceback (most recent call last): File “”, line 1, in raise KeyError KeyError 

            a. Raise без определенного исключения в Python

            Можно использовать ключевое слово raise и не указывая, какое исключение вызвать. Оно вызовет исключение, которое произошло. Поэтому его можно использовать только в блоке except .

            try: print('1'+1) except: raise 
            Traceback (most recent call last): File “”, line 2, in print(‘1’+1) TypeError: must be str, not int 

            b. Raise с аргументом в Python

            Также можно указать аргумент к определенному исключению в raise . Делается это с помощью дополнительных деталей исключения.

            raise ValueError("Несоответствующее значение") 
            Traceback (most recent call last): File "", line 1, in raise ValueError("Несоответствующее значение") ValueError: Несоответствующее значение 

            6. assert в Python

            Утверждение (assert) — это санитарная проверка для вашего циничного, параноидального «Я». Оно принимает инструкцию в качестве аргумента и вызывает исключение Python, если возвращается значение False . В противном случае выполняет операцию No-operation (NOP).

            assert(True) # код работает дальше 

            Если бы инструкция была False ?

            assert(1==0) 
            Traceback (most recent call last): File “”, line 1, in assert(1==0) AssertionError 

            Возьмем другой пример:

            try: print(1) assert 2+2==4 print(2) assert 1+2==4 print(3) except: print("assert False.") raise finally: print("Хорошо") print("Пока") 
            1 2 assert False. Хорошо Traceback (most recent call last): File “”, line 5, in assert 1+2==4 AssertionError 

            Утверждения можно использовать для проверки валидности ввода и вывода в функции.

            a. Второй аргумент для assert

            Можно предоставить второй аргумент, чтобы дать дополнительную информацию о проблеме.

            assert False,"Это проблема" 
            Traceback (most recent call last): File “”, line 1, in assert False,”Это проблема” AssertionError: Это проблема 

            7. Объявление собственных исключений Python

            Наконец, рассмотрим процесс создания собственных исключений. Для этого создадим новый класс из класса Exception . Потом его можно будет вызывать как любой другой тип исключения.

            class MyError(Exception): print("Это проблема") raise MyError("ошибка MyError") 
            Traceback (most recent call last): File “”, line 1, in raise MyError(“ошибка MyError”) MyError: ошибка MyError 

            Вот и все, что касается обработки исключений в Python.

            8. Вывод: обработка исключений Python

            Благодаря этой статье вы сможете обеспечить дополнительную безопасность своему коду. Все благодаря возможности обработки исключений Python, их вызова и создания собственных.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *