Исключение прохождения в 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