Базовый синтаксис исключения
try:
# Действия, которые необходимо выполнить
pass
except (Exception1[, Exception2[,...ExceptionN]]]) as exc_obj:
# Обработка указанных исключений
# exc_obj содержит экземпляр исключения
pass
else:
# Блок вызывается в случае если в процессе выполнения не возбуждалось исключений.
pass
finally:
# Блок выполняется всегда.
pass
Несколько обработчиков исключений
try:
# Действия, которые необходимо выполнить
pass
except ValueError:
# обработка исключения ValueError
pass
except (TypeError, ZeroDivisionError):
# Обработка нескольких исключений:
# TypeError and ZeroDivisionError
pass
except:
# Обработка всех остальных типов исключений
pass
Иерархия встроенных (built-in) исключений
BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- StopAsyncIteration
+-- ArithmeticError
| +-- FloatingPointError
| +-- OverflowError
| +-- ZeroDivisionError
+-- AssertionError
+-- AttributeError
+-- BufferError
+-- EOFError
+-- ImportError
| +-- ModuleNotFoundError
+-- LookupError
| +-- IndexError
| +-- KeyError
+-- MemoryError
+-- NameError
| +-- UnboundLocalError
+-- OSError
| +-- BlockingIOError
| +-- ChildProcessError
| +-- ConnectionError
| | +-- BrokenPipeError
| | +-- ConnectionAbortedError
| | +-- ConnectionRefusedError
| | +-- ConnectionResetError
| +-- FileExistsError
| +-- FileNotFoundError
| +-- InterruptedError
| +-- IsADirectoryError
| +-- NotADirectoryError
| +-- PermissionError
| +-- ProcessLookupError
| +-- TimeoutError
+-- ReferenceError
+-- RuntimeError
| +-- NotImplementedError
| +-- RecursionError
+-- SyntaxError
| +-- IndentationError
| +-- TabError
+-- SystemError
+-- TypeError
+-- ValueError
| +-- UnicodeError
| +-- UnicodeDecodeError
| +-- UnicodeEncodeError
| +-- UnicodeTranslateError
+-- Warning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- RuntimeWarning
+-- SyntaxWarning
+-- UserWarning
+-- FutureWarning
+-- ImportWarning
+-- UnicodeWarning
+-- BytesWarning
+-- ResourceWarning
Примеры использования встроенных исключений
# Использование блока try-except, исключение возбуждается.
try:
a = 1/0
except ZeroDivisionError:
print("Было обработано исключение")
else:
print("Исключений в процессе выполнения возбуждено не было")
finally:
print("Должно выполниться в любом случае")
# Использование блока try-except, исключений возбуждено не было.
try:
a = 1/5
except ZeroDivisionError:
print("Было обработано исключение")
else:
print("Исключений в процессе выполнения возбуждено не было")
finally:
print("Должно выполниться в любом случае")
Создание собственных исключений
Исключение в Python — класс, унаследованный от BaseException.
Для создания собственного исключения достаточно унаследовать его от любого built-in исключения в том месте иерархии, которая необходима.
Блок except ловит как исключение указанного класса, так и любого его наследника.
#Создание класса исключения.
class NetworkError(RuntimeError):
pass
try:
# Для возбуждения исключения необходимого типа используется инструкция raise.
raise NetworkError("Exception text")
except RuntimeError as e:
print("Обработана RuntimeError:", e)
except NetworkError as e:
print("Обработана NetworkError:", e)
При возбуждении исключения, выбирается первый подходящий обработчик.
# Здесь отработает хэндлер NetworkError.
class NetworkError(RuntimeError):
pass
try:
raise NetworkError("Exception text")
except NetworkError as e:
print("Обработана NetworkError:", e)
except RuntimeError as e:
print("Обработана RuntimeError:", e)
Каскадная обработка исключений
Инструкция raise без параметров возбуждает последнее произошедшее исключение. В случае, если она расположена в блоке except, исключение будет поймано обработчиками более высокого порядка.
class NetworkError(RuntimeError):
pass
try:
try:
# Для возбуждения исключения без передачи каких-либо параметров скобки.
# не обязательны. Экземпляр будет создан в любом случае.
raise NetworkError
except NetworkError as e:
print('Первый обработчик, id исключения:', id(e))
raise
except Exception as exc:
print('Второй обработчик, id исключения:', id(exc))
# Вложенные блоки работают одинаково везде
class NetworkError(RuntimeError):
pass
def func():
try:
raise NetworkError
except NetworkError as e:
print('Первый обработчик, id исключения:', id(e))
raise
try:
func()
except NetworkError as e:
print('Второй обработчик, id исключения:', id(e))
Привет тем, кто дочитал до конца! Надеюсь это было полезно? Если есть замечания, вопросы предложения я жду в комментариях. Вся информация взята из головы из практики ну и немного фантазии.
У меня есть свой сайт
happypython.ru на котором я выкладываю такие публикации. Приходите, читайте.
Еще мне нужны помощники по контенту на сайт, если у вас есть что рассказать или вы просто творческая личность - милости прошу пишите посотрудничаем. А в целом - спасибо за внимание )