Оператор raise в Python — вызов исключения
В этом уроке вы узнаете, как вызывать исключения с помощью оператора raise Python.
- Что такое оператор raise в Python?
- Повторный вызов текущего исключения
- Как вызвать другое исключение во время обработки
Что такое оператор raise в Python?
Чтобы вызвать исключение, используйте оператор raise:
raise ExceptionType()
ExceptionType() должен быть подклассом класса BaseException. Обычно это подкласс класса Exception. Обратите внимание, что ExceptionType не обязательно должен быть напрямую унаследован от класса Exception. Он может косвенно наследовать от класса, который является подклассом класса Exception.
Класс BaseException имеет метод __init__, который принимает аргумент *args. Это означает, что при возникновении исключения вы можете передать любое количество аргументов объекту исключения.
В следующем примере оператор raise используется для создания исключения ValueError. Он передает три аргумента методу ValueError __init__:
try: raise ValueError('The value error exception', 'x', 'y') except ValueError as ex: print(ex.args)
Выход:
('The value error exception', 'x', 'y')
Повторный вызов текущего исключения
Иногда вам нужно зарегистрировать исключение и снова вызвать то же исключение. В этом случае вы можете использовать оператор raise без указания объекта исключения.
Например, ниже определяется функция Division(), которая возвращает деление двух чисел:
def division(a, b): try: return a / b except ZeroDivisionError as ex: print('Logging exception:', str(ex)) raise
Если вы передадите ноль во второй аргумент функции Division(), возникнет исключение ZeroDivisionError. Однако вместо обработки исключения вы можете зарегистрировать его и снова вызвать.
Обратите внимание, что вам не нужно указывать объект исключения в инструкции повышения. В этом случае Python знает, что оператор поднять вызовет текущее исключение, перехваченное предложением исключения.
Следующий код вызывает исключение ZeroDivisionError:
division(1, 0)
И вы увидите как сообщение журнала, так и исключение в выводе:
Logging exception: division by zero Traceback(most recent call last): File "c:/pythontutorial/app.py", line 9, in <module> division(1, 0) File "C:/pythontutorial/app.py", line 3, in division return a / b ZeroDivisionError: division by zero
Как вызвать другое исключение во время обработки
При обработке исключения вам может потребоваться вызвать другое исключение. Например:
def division(a, b): try: return a / b except ZeroDivisionError as ex: raise ValueError('b must not zero')
В функции Division() мы вызываем исключение ValueError, если возникает ZeroDivisionError.
Если вы запустите следующий код, вы получите подробную информацию о трассировке стека:
division(1, 0)
Выход:
Traceback(most recent call last): File "C:/pythontutorial/app.py", line 3, in division return a / b ZeroDivisionError: division by zero During handling of the above exception, another exception occurred: Traceback(most recent call last): File "C:/pythontutorial/app.py", line 8, in <module> division(1, 0) File "C:/pythontutorial/app.py", line 5, in division raise ValueError('b must not zero') ValueError: b must not zero
Сначала возникает исключение ZeroDivisionError:
Traceback(most recent call last): File "C:/pythontutorial/app.py", line 3, in division return a / b ZeroDivisionError: division by zero
Во-вторых, во время обработки исключения ZeroDivisionError возникает исключение ValueError:
Traceback(most recent call last): File "C:/pythontutorial/app.py", line 8, in <module> division(1, 0) File "C:/pythontutorial/app.py", line 5, in division raise ValueError('b must not zero') ValueError: b must not zero