Содержание

Обработка исключений python — try/except и raise

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

В этом материале речь пойдет о блоках 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 “<pyshell#113>”, line 2, in <module>  
    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 "<pyshell#1>", line 2, in <module>
    print(1/0)
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
  File "<pyshell#1>", line 4, in <module>
    print(2/0)
ZeroDivisionError: division by zero

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

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

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

raise ZeroDivisionError
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    raise ZeroDivisionError
ZeroDivisionError

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

a,b=int(input()),int(input())  # вводим 1 затем 0
if b==0:
    raise ZeroDivisionError
Traceback (most recent call last):
  File "<pyshell#2>", line 3, in <module>
    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 “<pyshell#180>”, line 1, in <module>
    raise KeyError
KeyError

a.

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

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

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

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

Также можно указать аргумент к определенному исключению в

raise. Делается это с помощью дополнительных деталей исключения.

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

6. assert в Python

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

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

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


assert(1==0)
Traceback (most recent call last):
  File “<pyshell#157>”, line 1, in <module>
    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 “<pyshell#157>”, line 5, in <module>
    assert 1+2==4
AssertionError

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

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

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

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

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

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

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

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

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

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

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

Последнее обновление: 25. 01.2022

При программировании на Python мы можем столкнуться с двумя типами ошибок. Первый тип представляют синтаксические ошибки (syntax error). Они появляются в результате нарушения синтаксиса языка программирования при написании исходного кода. При наличии таких ошибок программа не может быть скомпилирована. При работе в какой-либо среде разработки, например, в PyCharm, IDE сама может отслеживать синтаксические ошибки и каким-либо образом их выделять.

Второй тип ошибок представляют ошибки выполнения (runtime error). Они появляются в уже скомпилированной программе в процессе ее выполнения. Подобные ошибки еще называются исключениями. Например, в прошлых темах мы рассматривали преобразование строки в число:


string = "5"
number = int(string)
print(number)

Данный скрипт успешно скомпилируется и выполнится, так как строка «5» вполне может быть конвертирована в число. Однако возьмем другой пример:


string = "hello"
number = int(string)
print(number)

При выполнении этого скрипта будет выброшено исключение ValueError, так как строку «hello» нельзя преобразовать в число:

ValueError: invalid literal for int() with base 10: 'hello'

С одной стороны, здесь очевидно, что строка не представляет число, но мы можем иметь дело с вводом пользователя, который также может ввести не совсем то, что мы ожидаем:


string = input("Введите число: ")
number = int(string)
print(number)

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

try..except

Конструкция try..except имеет следующее формальное определение:


try:
	инструкции
except [Тип_исключения]:
	инструкции

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

После ключевого слова except опционально можно указать, какое исключение будет обрабатываться (например, ValueError или KeyError). После слова except на следующей стоке идут инструкции блока except, выполняемые при возникновении исключения.

Рассмотрим обработку исключения на примере преобразовании строки в число:


try:
    number = int(input("Введите число: "))
    print("Введенное число:", number)
except:
    print("Преобразование прошло неудачно")
print("Завершение программы")

Вводим строку:


Введите число: hello
Преобразование прошло неудачно
Завершение программы

Как видно из консольного вывода, при вводе строки вывод числа на консоль не происходит, а выполнение программы переходит к блоку except.

Вводим правильное число:


Введите число: 22
Введенное число: 22
Завершение программы

Теперь все выполняется нормально, исключение не возникает, и соответственно блок except не выполняется.

Блок finally

При обработке исключений также можно использовать необязательный блок finally. Отличительной особенностью этого блока является то, что он выполняется вне зависимости, было ли сгенерировано исключение:


try:
    number = int(input("Введите число: "))
    print("Введенное число:", number)
except:
    print("Преобразование прошло неудачно")
finally:
    print("Блок try завершил выполнение")
print("Завершение программы")

Как правило, блок finally применяется для освобождения используемых ресурсов, например, для закрытия файлов.

НазадСодержаниеВперед

Try Catch в Python — Введение в обработку ошибок [в 2022 г.]

Обработка ошибок в Python. Дизайн изображения: Элиас Эрваст

В Python нет такой вещи, как try-catch .

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

Например:

 попробуйте:
  печать (х)
кроме:
  print("Вызвано исключение. x не существует.") 

Вывод:

 Возникло исключение. х не существует. 
  • Здесь программа пытается запустить код внутри блока try .
  • В случае сбоя блок , кроме , перехватывает возникшее исключение.

Шаблон Try-Except в обработке ошибок Python

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

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

Шаблон обработки ошибок в Python состоит из следующего:

  • Блок try . Он запускает часть кода. Если этот фрагмент кода не работает, возникает исключение.
  • Блок , кроме . Этот блок перехватывает возможную ошибку, возникшую в блоке try .
  • Блок необязательный finally . Это запускает часть кода независимо от того, были ошибки или нет. Это необязательный блок кода, который вам не нужен в схеме обработки ошибок.

Например, вы можете использовать структуру try-except, чтобы проверить, не определено ли имя:

 try:
  печать (х)
кроме:
  print("Вызвано исключение.  x не существует.") 

На самом деле это плохая практика. Это связано с тем, что мы не определяем тип ожидаемой ошибки в блоке , кроме .

Чтобы это исправить, нужно знать, что если x не определено, возникает ошибка NameError .

Теперь можно ожидать возможную ошибку NameError в блоке исключений. Это делает код более понятным:

 попробуйте:
  печать (х)
кроме NameError:
  print("NameError: x не определено") 

Вывод:

 NameError: x не определен. 

А что, если может возникнуть более одного исключения? Без проблем. Python позволяет определить столько блоков , кроме , сколько необходимо.

Множественные исключения в обработке ошибок Python

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

Например, давайте разделим два числа друг на друга. Прежде чем сделать это, есть две вещи, которые могут пойти не так:

  • Один или оба числа не определены.
  • Знаменатель равен нулю.

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

Давайте превратим это в код:

 попытка:
    результат = х/у
кроме ZeroDivisionError:
    print("Убедитесь, что деление на 0 не производится. ")
кроме NameError:
    print("Убедитесь, что оба числа определены.") 

Поскольку x и y не определены, благодаря нашей тщательной обработке ошибок появится сообщение об ошибке:

 Убедитесь, что оба числа определены 

Сейчас , давайте определим x и y , но давайте сделаем y нулями:

 попробуйте:
    х = 10
    у = 0
    результат = х/у
кроме ZeroDivisionError:
    print("Убедитесь, что деление на 0 не производится.")
кроме NameError:
    print("Убедитесь, что оба числа определены." 

Это приводит к исключению деления на ноль:

 Убедитесь, что деление на 0 не производится.  

Наконец, давайте напишем код, чтобы он не вызывал ошибок:

 попробуйте:
    х = 10
    у = 5
    результат = х/у
кроме ZeroDivisionError:
    print("Убедитесь, что деление на 0 не производится.")
кроме NameError:
    print("Убедитесь, что оба числа определены.") 

Теперь сообщения об ошибке нет. Это означает, что программа успешно запущена.

Блок Else в обработке ошибок Python

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

Например:

 попробуйте:
    х = 15
    у = 5
    результат = х/у
    печать (результат)
кроме ZeroDivisionError:
    print("Убедитесь, что деление на 0 не производится. ")
еще:
    print("Ошибок не было") 

Блок finally в обработке ошибок Python

Блок finally является необязательным блоком, который выполняется независимо от того, были ошибки или нет.

Например:

 попробуйте:
    у = 10
    печать (у)
кроме:
    print("Произошла ошибка")
еще:
    print("Ошибок не было.")
в конце концов:
    print("Процесс завершен") 

Вывод:

 Число 10
Ошибок не было.
Процесс завершен. 

Заключение

В Python нет такой вещи, как try-catch. Вместо этого Python использует подход try-except для обработки ошибок и исключений.

Вот пример:

 попробуйте:
  печать (х)
кроме:
  print("x не определен")
в конце концов:
  print("Процесс завершен") 

Вывод:

 x не определен
Процесс завершен 

Спасибо за прочтение. Я надеюсь, тебе это нравится.

Удачного кодирования.

Дополнительная литература

50 вопросов из интервью по Python с ответами

50+ модных словечек веб-разработки

«попробуйте… кроме… иначе… наконец…» в Python

В Python, попробуйте и , кроме , используются для обработки исключений (= ошибки, обнаруженные во время выполнения). С попробуйте и , кроме , даже если возникает исключение, процесс продолжается без завершения. Вы можете использовать , иначе и , наконец, , чтобы установить конечный процесс.

  • 8. Ошибки и исключения — обработка исключений — документация по Python 3.9.0
  • 8. Составные операторы — оператор try — документация по Python 3.9.0

В этой статье описывается следующее содержимое.

  • Базовая обработка исключений в Python: try ... кроме ...
  • Перехват нескольких исключений
    • Применение различных операций к нескольким исключениям
    • Применить одну и ту же операцию к нескольким исключениям
  • Перехватить все исключения
    • Подстановочный знак, кроме (Голые кроме)
    • Базовый класс: Исключение
  • Выполнить действие, если нет исключения: попробовать... кроме... иначе...
  • Действие по очистке: попытка. .. кроме... наконец...
  • Игнорировать исключения: пройти
  • Практический пример: чтение файлов изображений

Базовая обработка исключений в Python:

try ... кроме ...

Например, при попытке деления на ноль возникает ошибка ZeroDivisionError , и процесс завершается.

 # печать (1 / 0)
# ZeroDivisionError: деление на ноль
 

источник: exception_handling.py

Чтобы перехватить это исключение, напишите следующее:

 попробуйте:
    печать (1 / 0)
кроме ZeroDivisionError:
    распечатать('Ошибка')
# Ошибка
 

источник: exception_handling.py

При установке кроме <имя-исключения> как <имя-переменной>: объект исключения сохраняется в переменной. Вы можете указать любое имя для переменной, но часто используются такие имена, как e и err .

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

 попробуйте:
    печать (1 / 0)
кроме ZeroDivisionError как e:
    печать (е)
    печать (тип (е))
# деление на ноль
# <класс 'ZeroDivisionError'>
 

источник: exception_handling.py

В Python2 следует писать как , кроме <имя-исключения>, <имя-переменной>: .

Можно также указать базовый класс. Например, ArithmeticError является базовым классом для ZeroDivisionError . Переменная хранит объект исключения производного класса, который действительно произошел.

 печать (issubclass (ZeroDivisionError, ArithmeticError))
# Истинный
пытаться:
    печать (1 / 0)
кроме ArithmeticError как e:
    печать (е)
    печать (тип (е))
# деление на ноль
# <класс 'ZeroDivisionError'>
 

источник: exception_handling.py

См. официальную документацию по встроенным исключениям в Python.

  • Встроенные исключения — Документация по Python 3.9.0

Когда в предложении try возникает исключение, последующий процесс в предложении try пропускается.

Как показано в примере ниже, если исключение возникает в середине цикла for , цикл for заканчивается в этой точке, и процесс в , за исключением пункта .

 попробуйте:
    для i в [-2, -1, 0, 1, 2]:
        печать (1 / я)
кроме ZeroDivisionError как e:
    печать (е)
# -0,5
# -1.0
# деление на ноль
 

источник: exception_handling.py

Вы можете указать процесс, который будет выполняться после предложения , кроме , в предложении else и finally , описанном ниже.

Перехват множественных исключений

Определите следующую функцию, которая перехватывает ZeroDivisionError .

 по умолч. разделить(а, б):
    пытаться:
        печать (а / б)
    кроме ZeroDivisionError как e:
        print('поймать ZeroDivisionError:', e)
 

источник: exception_handling.py

С помощью этой функции можно перехватить ZeroDivisionError , но другие исключения перехватить невозможно.

 разделить(1, 0)
# поймать ZeroDivisionError: деление на ноль
# разделить('а', 'б')
# TypeError: неподдерживаемые типы операндов для /: 'str' и 'str'
 

источник: exception_handling.py

Применение разных операций к нескольким исключениям

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

 по определению разделитель_каждый (а, б):
    пытаться:
        печать (а / б)
    кроме ZeroDivisionError как e:
        print('поймать ZeroDivisionError:', e)
    кроме TypeError как e:
        print('поймать TypeError:', e)
разделить_каждый (1, 0)
# поймать ZeroDivisionError: деление на ноль
разделить_каждый ('а', 'б')
# поймать TypeError: неподдерживаемые типы операндов для /: 'str' и 'str'
 

источник: exception_handling.py

Примените одну и ту же операцию к нескольким исключениям

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

 по определению, разделите_то же (а, б):
    пытаться:
        печать (а / б)
    кроме (ZeroDivisionError, TypeError) как e:
        печать (е)
разделить_то же (1, 0)
# деление на ноль
разделить_то же ('а', 'б')
# неподдерживаемые типы операндов для /: 'str' и 'str'
 

источник: exception_handling.py

Перехватывать все исключения

Также можно перехватывать все исключения без указания исключений.

Подстановочный знак, кроме (Голое исключение)

Все исключения можно перехватывать, опуская имя исключения в предложении , кроме . При наличии нескольких предложений , кроме , имя исключения можно опустить только в последнем предложении , кроме .

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

В последнем предложении exclude можно опускать имена исключений, чтобы они служили подстановочными знаками. Используйте это с особой осторожностью, так как таким образом легко замаскировать настоящую ошибку программирования! 8. Ошибки и исключения — обработка исключений — документация по Python 3.9.0

 по определению разделитель подстановочных знаков (а, б):
    пытаться:
        печать (а / б)
    кроме:
        распечатать('Ошибка')
разделить_подстановочный знак (1, 0)
# Ошибка
Division_wildcard ('а', 'б')
# Ошибка
 

источник: exception_handling.py

С подстановочным знаком, кроме всех исключений, включая SystemExit (вызвано sys.exit() и т. д.) и KeyboardInterrupt (вызвано вводом клавиши прерывания Ctrl + C ) перехвачены. Во многих случаях лучше завершить процесс без перехвата этих исключений, поэтому лучше использовать Exception , описанный далее.

Базовый класс:

Exception

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

  • Встроенные исключения — Исключение — Документация по Python 3.9.0
 по определению разделитель_исключение (а, б):
    пытаться:
        печать (а / б)
    кроме Исключения как e:
        печать (е)
разделить_исключение (1, 0)
# деление на ноль
разделить_исключение ('а', 'б')
# неподдерживаемые типы операндов для /: 'str' и 'str'
 

источник: exception_handling.py

Иерархия классов для встроенных исключений выглядит следующим образом.

  • Встроенные исключения — иерархия исключений — Документация по Python 3.9.0
 Базовое исключение
 +-- Выход из системы
 +-- Прерывание Клавиатуры
 +-- ГенераторВыход
 +-- Исключение
      +-- Остановить итерацию
      +-- StopAsyncIteration
      +-- ...
      ...
 

Поскольку SystemExit и KeyboardInterrupt не наследуют Exception , если Exception указано в предложении кроме , sys.exit() и исключение ввода прерывания не будет перехвачено.

Это исключение вызывается функцией sys.exit(). Он наследуется от BaseException, а не от Exception, поэтому он не может быть случайно перехвачен кодом, который перехватывает Exception. Это позволяет исключению правильно распространяться и вызывать выход интерпретатора. Встроенные исключения — SystemExit — Документация по Python 3.9.0

Возникает, когда пользователь нажимает клавишу прерывания (обычно Control-C или Delete). Во время выполнения регулярно выполняется проверка прерываний. Исключение наследуется от BaseException, чтобы не быть случайно перехваченным кодом, который перехватывает Exception и, таким образом, предотвращает выход интерпретатора. Встроенные исключения — KeyboardInterrupt — Документация по Python 3.9.0

Базовым классом для всех встроенных исключений, включая SystemExit и KeyboardInterrupt , является BaseException . Если вы укажете BaseException вместо Exception в предложении , кроме , будут перехвачены все исключения, а также подстановочные знаки, кроме.

  • Встроенные исключения — BaseException — Документация по Python 3.9.0

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

Выполнить действие, если нет исключения:

try ... кроме ... еще ...

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

 по умолчанию разделите_еще (а, б):
    пытаться:
        печать (а / б)
    кроме ZeroDivisionError как e:
        print('поймать ZeroDivisionError:', e)
    еще:
        print('Готово (без ошибок)')
разделить_еще (1, 2)
# 0,5
# закончить (без ошибок)
разделить_еще (1, 0)
# поймать ZeroDivisionError: деление на ноль
 

источник: exception_handling. py

Действие очистки:

try ... кроме ... finally ...

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

 по определению разделите_наконец (а, б):
    пытаться:
        печать (а / б)
    кроме ZeroDivisionError как e:
        print('поймать ZeroDivisionError:', e)
    в конце концов:
        распечатать('все готово')
разделить_наконец (1, 2)
# 0,5
# все готово
разделить_наконец (1, 0)
# поймать ZeroDivisionError: деление на ноль
# все готово
 

источник: exception_handling.py

Вы также можете использовать предложение else и finally вместе. Если исключения не возникает, выполняется предложение else , а затем , наконец, пункт выполнен.

 по определению разделять_еще_наконец (а, б):
    пытаться:
        печать (а / б)
    кроме ZeroDivisionError как e:
        print('поймать ZeroDivisionError:', e)
    еще:
        print('Готово (без ошибок)')
    в конце концов:
        распечатать('все готово')
разделить_еще_наконец(1, 2)
# 0,5
# закончить (без ошибок)
# все готово
разделить_еще_наконец (1, 0)
# поймать ZeroDivisionError: деление на ноль
# все готово
 

источник: exception_handling. py

Игнорировать исключения:

pass

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

 по определению разделитель_перехода (а, б):
    пытаться:
        печать (а / б)
    кроме ZeroDivisionError:
        проходить
разделить_проход (1, 0)
 

источник: exception_handling.py

Дополнительные сведения об инструкции pass см. в следующей статье.

  • Оператор pass в Python

Практический пример: чтение файлов изображений

Удобным примером использования обработки исключений является чтение файлов изображений.

Ниже приведен пример изменения размера файлов изображений в папке с помощью Pillow.

  • Изменение размера изображений с помощью Python, Pillow

Без обработки исключений:

Получить все пути к файлам в папке с помощью glob() и изменить размер только файлов, которые соответствуют определенным расширениям.

  • Получить имя файла, каталог, расширение из строки пути в Python
  • в операторе Python (для списка, строки, словаря и т. д.)
 импорт ОС
импортировать глобус
из изображения импорта PIL
dst_dir = 'data/temp/images_half'
os.makedirs (dst_dir, exists_ok = True)
 

источник: Pillow_image_resize_all.py

 files = glob.glob('./data/temp/images/*')
для f в файлах:
    root, ext = os.path.splitext(f)
    если расширение в ['.jpg', '.png']:
        img = Image.open(f)
        img_resize = img.resize((img.width // 2, img.height // 2))
        базовое имя = os.path.basename(root)
        img_resize.save(os.path.join(dst_dir, basename + '_half' + ext))
 

источник: Pillow_image_resize_all.py

Поскольку файлы изображений имеют различные расширения, указать их все сложно.

С обработкой исключений:

 files = glob.glob('./data/temp/images/*')
для f в файлах:
 пытаться:
 img = Image.open(f)
 img_resize = img.