Wednesday, December 4, 2013

fun with raise

>>> raise ValueError("wrong value")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: wrong value
>>> try:
...    raise ValueError("wrong value")
... except:
...    raise sys.exc_info()
...
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
ValueError

If you want to really re-raise the exact same message, replace sys.exc_info()[0] with the exception instance.

>>> try:
...    raise ValueError("wrong value")
... except Exception as e:
...    raise (e,) + sys.exc_info()[1:]
...
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
ValueError: wrong value

Alas, replacing the traceback object (sys.exc_info()[2]) does not seem to work:

>>> try:
...     json.loads('NOT JSON')
... except:
...     _, _, tb = sys.exc_info()
...
>>> try:
...    1 / 0
... except Exception as e:
...    raise sys.exc_info()[:2], tb
...
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
ZeroDivisionError: <traceback object at 0x02B752B0>