Исключение прохождения в Python

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

Пример A:

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

Пример B:

>>> 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

Ответы

Ответ 1

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

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 и метаризовать ее где-то в другом месте, даже если на этом пути были встречены другие исключения.

Ответ 2

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

except Exception as e: raise e

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

except Exception as e: raise