Найти тему
mrmarshanskiy

Try-Except в Python. Типы исключений. Примеры.

Оглавление

Общее

Механизм исключений в Python используется для обработки ошибок и исключительных ситуаций, которые могут возникнуть во время выполнения программы. Когда происходит исключительная ситуация, Python создает объект исключения, который содержит информацию об ошибке, и передает его обработчику исключений.

Механизм исключений в Python использует ключевые слова try, except, else и finally.

Конструкция try-except позволяет обработать исключительную ситуацию. Она имеет следующий синтаксис:

В этой конструкции блок try содержит код, который может вызвать исключительную ситуацию.

Если исключительная ситуация возникает, то управление передается блоку except, где исключение обрабатывается.

ExceptionType - это тип исключения, которое вы хотите обработать. Если указать Exception без аргументов, то обработчик исключений будет обрабатывать все типы исключений.

Блок else опционален и содержит код, который будет выполнен, если в блоке try не возникает исключительной ситуации.

Блок finally также опционален и содержит код, который будет выполнен в любом случае после выполнения блока try и except.

Например:

-2

В этом примере блок try пытается выполнить деление на ноль, что приведет к возникновению исключительной ситуации ZeroDivisionError.

Управление передается в блок except, где выводится сообщение "Деление на ноль!".

Блок else не выполнится, потому что возникла исключительная ситуация, но блок finally будет выполнен и выведет сообщение "Этот блок выполнится в любом случае!".

Типы исключений

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

  • AssertionError - возникает, когда утверждение assert не выполняется.
  • AttributeError - возникает, когда объект не имеет атрибута.
  • EOFError - возникает, когда достигнут конец файла (End of File) в функции input().
  • ImportError - возникает, когда не удалось импортировать модуль или его атрибут.
  • IndexError - возникает, когда индекс не входит в диапазон элементов последовательности.
  • KeyError - возникает, когда ключ не найден в словаре.
  • NameError - возникает, когда локальная или глобальная переменная не определена.
  • TypeError - возникает, когда операция не может быть выполнена из-за несоответствия типов.
  • ValueError - возникает, когда функция получает аргумент правильного типа, но неправильного значения.
  • ZeroDivisionError - возникает, когда попытка деления на ноль.

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

Примеры

KeyError

-3

В этом примере кода мы пытаемся получить значение для ключа 'd' из словаря my_dict. Однако, такого ключа в словаре нет, поэтому возникает исключение KeyError. В блоке except мы обрабатываем это исключение и выводим сообщение "Ключ не найден!".

ValueError

-4

В этом примере мы пытаемся преобразовать строку "abc" в целое число, используя функцию int(). Однако, такая строка не может быть преобразована в число, поэтому возникает исключение ValueError. В блоке except мы обрабатываем это исключение и выводим сообщение "Неправильный формат числа!".

IndexError

-5

В этом примере мы пытаемся получить значение по индексу 3 из списка my_list. Однако, в этом списке всего три элемента, поэтому индекс 3 находится за пределами диапазона и возникает исключение IndexError. В блоке except мы обрабатываем это исключение и выводим сообщение "Индекс находится за пределами диапазона!".

TypeError

-6

В этом примере мы пытаемся сложить строку "abc" и число 123. Однако, такая операция не может быть выполнена из-за несоответствия типов данных и возникает исключение TypeError. В блоке except мы обрабатываем это исключение.

AttributeError

-7

В этом примере мы пытаемся вызвать метод push() у списка my_list. Однако, в Python нет такого метода для списков, поэтому возникает исключение AttributeError. В блоке except мы обрабатываем это исключение и выводим сообщение "Метод 'push' не существует для списка!".

Try-except или if-else

В некоторых случаях использование конструкции try-except может быть более эффективным, чем проверка условия с помощью конструкции if-else. Это происходит по нескольким причинам:

  1. Меньше проверок условий: Когда используется конструкция if-else, условие проверяется каждый раз при выполнении кода. В то время как конструкция try-except проверяет условие только в момент возникновения исключения. Это может сэкономить время, если условие проверяется много раз.
  2. Улучшенная читаемость кода: Использование конструкции try-except может сделать код более читаемым, особенно если проверка условий с помощью конструкции if-else затруднительна или занимает много места.
  3. Обработка ошибок: Конструкция try-except позволяет легко обрабатывать ошибки и исключения, которые могут возникнуть во время выполнения кода. Обработка ошибок может улучшить надежность и безопасность программы, а также упростить ее тестирование и отладку.

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

Примеры

Пример 1

Конструкция try-except может быть полезна в ситуациях, когда необходимо обрабатывать ошибки, которые могут возникнуть при выполнении кода, например, при работе с файлами или при работе с внешними API. Рассмотрим пример, когда использование try-except более эффективно, чем if-else:

-8

В этом примере мы создали функцию load_json(), которая загружает данные из файла в формате JSON и возвращает эти данные в виде словаря. Если при загрузке данных возникает исключение FileNotFoundError, то мы выводим сообщение "Файл не найден!" и возвращаем значение None. Если при загрузке данных возникает исключение JSONDecodeError, то мы выводим сообщение "Ошибка декодирования JSON!" и возвращаем значение None. В противном случае, мы возвращаем загруженные данные.

В этом примере использование конструкции try-except более эффективно, чем использование if-else, потому что мы можем легко обрабатывать различные исключения, которые могут возникнуть при загрузке данных. Кроме того, использование try-except делает код более читаемым, так как мы можем легко определить, какие исключения могут возникнуть в данном участке кода и какие действия нужно выполнить в каждом случае.

Пример 2

Конструкция try-except может быть полезна в циклах, когда необходимо обрабатывать ошибки, которые могут возникнуть при выполнении кода. Например, если мы хотим разбить строку на числа и получить сумму этих чисел, то мы можем использовать конструкцию try-except, чтобы обработать возможные ошибки. Рассмотрим пример:

-9

В этом примере мы разбиваем строку my_string на части, используя разделитель ,. Затем мы пытаемся преобразовать каждую часть в целое число с помощью функции int(). Если преобразование не удалось (в случае, когда часть содержит символы, отличные от цифр), то мы просто пропускаем эту часть и переходим к следующей. В результате мы получаем список чисел my_numbers, которые мы складываем с помощью функции sum() и выводим на экран.

В этом примере использование конструкции try-except более эффективно, чем использование if-else, потому что мы не делаем дополнительные вычисления на проверку, можно ли превратить строку в число.

Контекстный менеджер + механизм исключений

Контекстные менеджеры и механизм исключений try-except могут использоваться вместе и дополнять друг друга для более эффективного управления ресурсами и обработки ошибок в Python.

Контекстные менеджеры позволяют выполнять код с определенными ресурсами (например, файлами или сетевыми соединениями), и автоматически освобождать эти ресурсы после завершения работы с ними. Контекстный менеджер может быть использован с помощью конструкции with.

Механизм исключений try-except позволяет обрабатывать исключения и ошибки, которые могут возникнуть при выполнении кода. Это позволяет предотвратить сбой программы и выполнить альтернативные действия, если что-то пошло не так.

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

-10

В этом примере мы открываем файл 'example.txt' внутри контекстного менеджера with, который автоматически закроет файл после завершения работы с ним. Мы также используем конструкцию try-except, чтобы обработать возможные ошибки при работе с файлом, например, если файл не найден или если у нас нет прав доступа к файлу. В блоке finally мы выводим сообщение, что ресурсы освобождаются. Этот блок выполняется всегда, независимо от того, была ли ошибка или нет.

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

Пример с Django

Для сохранения объектов в базу данных в Django часто используется функция atomic(), которая позволяет обернуть выполнение кода в транзакцию. Контекстный менеджер with может быть использован с функцией atomic(), чтобы автоматически управлять транзакцией и обработать возможные ошибки.

Рассмотрим пример:

-11

В этом примере мы создаем объект MyModel с именем "Example" и сохраняем его в базу данных. Мы также используем функцию atomic(), чтобы обернуть выполнение кода в транзакцию. Если при сохранении объекта возникает ошибка, мы перехватываем исключение и выводим сообщение об ошибке.

Контекстный менеджер with используется для автоматического управления транзакцией. Когда выполнение кода внутри блока with завершается, транзакция автоматически фиксируется или откатывается в зависимости от того, произошла ли ошибка или нет. Если при сохранении объекта возникает исключение, транзакция откатывается и изменения не сохраняются в базу данных.

Таким образом, использование контекстного менеджера with с функцией atomic() позволяет безопасно сохранять объекты в базу данных и обрабатывать возможные ошибки при выполнении транзакции. А конструкция try-except позволяет обработать возникшую ошибку и вернуть корректный ответ.

Скопировать код можно из поста на Boosty
Механизм исключений. Типы исключений. Примеры. - mr.Marshanskiy