cython
1import sys
2
3def reraise(f, exc):
4"""
5>>> def f(exc): raise exc
6>>> reraise(f, TypeError)
7Traceback (most recent call last):
8TypeError
9
10>>> def f(exc): raise exc('hiho')
11>>> reraise(f, TypeError)
12Traceback (most recent call last):
13TypeError: hiho
14"""
15try:
16f(exc)
17except:
18assert sys.exc_info()[0] is exc, str(sys.exc_info()[1])
19raise
20
21def reraise_original(f, exc, raise_catch):
22"""
23>>> def f(exc): raise exc
24>>> def raise_catch_py():
25... try: raise ValueError
26... except: pass
27
28>>> reraise_original(f, TypeError, raise_catch_py)
29Traceback (most recent call last):
30TypeError
31
32>>> reraise_original(f, TypeError, raise_catch_cy)
33Traceback (most recent call last):
34TypeError
35
36>>> reraise_original(f, TypeError, raise_catch_cy_non_empty)
37Traceback (most recent call last):
38TypeError
39"""
40try:
41f(exc)
42except:
43raise_catch()
44assert sys.exc_info()[0] is exc, str(sys.exc_info()[1])
45raise
46
47
48def raise_catch_cy():
49try: raise ValueError
50except: pass
51
52def raise_catch_cy_non_empty():
53try: raise ValueError
54except:
55a = 1+1
56