Исключение, передаваемое в Python - PullRequest
18 голосов
/ 19 января 2011

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

Пример A:

>>> 3/0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

Пример Б:

>>> try: 3/0
... except Exception as e: raise e
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ZeroDivisionError: integer division or modulo by zero

В обоих этих примерах исключение действительно возникает в строке 1, где мы пытаемся выполнить 3/0, но в последнем примере нам говорят, что это произошло в строке 2, где оно поднято.

Есть ли в Python способ вызвать исключение, как если бы это было еще одно исключение, которое могло бы выдать следующий вывод:

>>> try: 3/0
... except Exception as e: metaraise(e)
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero

Ответы [ 2 ]

23 голосов
/ 19 января 2011

Когда вы повторно вызываете исключение, которое вы поймали, например,

except Exception as e: raise e

сбрасывает трассировку стека. Это как повторное поднятие нового исключения. То, что вы хотите, это:

except Exception as e: raise
5 голосов
/ 24 января 2011

Для справки, решение примерно следующее:

def getException():
    return sys.exc_info()

def metaraise(exc_info):
    raise exc_info[0], exc_info[1], exc_info[2]

try: 3/0
except:
    e = getException()
    metaraise(e)

Прекрасная часть этого состоит в том, что вы можете затем передать переменную e и метаизировать ее где-нибудь еще, даже если встречались другие исключенияпо пути.

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