Python эквивалент Java Исключение с причиной - PullRequest
3 голосов
/ 14 января 2020

Есть ли способ в Python вызвать ошибку с другой ошибкой в ​​качестве причины?

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

try {
    throw new IOException();
} catch (IOException e) {
    throw new RuntimeException("An exception occurred while trying to execute", e);
}

, приводящий к этому сообщению об ошибке:

Exception in thread "main" java.lang.RuntimeException: An exception occurred while trying to execute
    at thing.Main.main(Main.java:11)
Caused by: java.io.IOException
    at thing.Main.main(Main.java:9)

Обратите внимание, что первое исключение (в трассировке стека) "вызвано" вторым.

Это, на мой взгляд, отличный способ показать пользователю API, что во время вызова произошла ошибка более высокого уровня, и разработчик может отладить ее, посмотрев на исключение более низкого уровня, которое является «причиной» более высокого уровня. ошибка высокого уровня (в данном случае исключение RuntimeException вызвано IOException).

В результате проведенных поисков я не смог ничего найти о том, что ошибка является причиной другого в Python. Может ли это быть достигнуто в Python? Как? А если нет, что будет эквивалентным Pythoni c?

1 Ответ

2 голосов
/ 14 января 2020

В Python это достигается очень похожей структурой:

try:
    raise ValueError
except ValueError:
    raise ValueError('second exception')

Это приведет к следующей трассировке:

Traceback (most recent call last):
  File "main.py", line 2, in <module>
    raise ValueError
ValueError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "main.py", line 4, in <module>
    raise ValueError('second exception')
ValueError: second exception

Другая Python функция - raise from которые обеспечивают немного другую трассировку:

try:
    raise ValueError
except ValueError as e:
    raise ValueError('second exception') from e

Трассировка:

Traceback (most recent call last):
  File "main.py", line 2, in <module>
    raise ValueError
ValueError

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "main.py", line 4, in <module>
    raise ValueError('second exception') from e
ValueError: second exception

Дополнительная информация:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...