1# mode: run
2# tag: exceptions
3
4import sys
5IS_PY3 = sys.version_info[0] >= 3
6
7
8__doc__ = u"""
9>>> if not IS_PY3: sys.exc_clear()
10
11>>> def test_py(outer_exc):
12...   try:
13...     raise AttributeError
14...   except AttributeError:
15...     print(sys.exc_info()[0] is AttributeError or sys.exc_info()[0])
16...     try: raise KeyError
17...     except:
18...       print(sys.exc_info()[0] is KeyError or sys.exc_info()[0])
19...       if IS_PY3:
20...         print(isinstance(sys.exc_info()[1].__context__, AttributeError)
21...               or sys.exc_info()[1].__context__)
22...       else:
23...         print(True)
24...     print((IS_PY3 and sys.exc_info()[0] is AttributeError) or
25...           (not IS_PY3 and sys.exc_info()[0] is KeyError) or
26...           sys.exc_info()[0])
27...   print((IS_PY3 and sys.exc_info()[0] is outer_exc) or
28...         (not IS_PY3 and sys.exc_info()[0] is KeyError) or
29...         sys.exc_info()[0])
30
31>>> print(sys.exc_info()[0]) # 0
32None
33
34>>> test_py(None)
35True
36True
37True
38True
39True
40>>> print(sys.exc_info()[0]) # test_py()
41None
42
43>>> test_c(None)
44True
45True
46True
47True
48True
49>>> print(sys.exc_info()[0]) # test_c()
50None
51
52>>> def test_py2():
53...   try:
54...     raise Exception
55...   except Exception:
56...     test_py(Exception)
57...     print(sys.exc_info()[0] is Exception or sys.exc_info()[0])
58...   print((IS_PY3 and sys.exc_info()[0] is None) or
59...         (not IS_PY3 and sys.exc_info()[0] is Exception) or
60...         sys.exc_info()[0])
61
62>>> test_py2()
63True
64True
65True
66True
67True
68True
69True
70>>> print(sys.exc_info()[0]) # test_py2()
71None
72
73>>> test_c2()
74True
75True
76True
77True
78True
79True
80True
81>>> print(sys.exc_info()[0]) # test_c2()
82None
83"""
84
85
86def test_c(outer_exc):
87    try:
88        raise AttributeError
89    except AttributeError:
90        print(sys.exc_info()[0] is AttributeError or sys.exc_info()[0])
91        try: raise KeyError
92        except:
93            print(sys.exc_info()[0] is KeyError or sys.exc_info()[0])
94            if IS_PY3:
95                print(isinstance(sys.exc_info()[1].__context__, AttributeError)
96                      or sys.exc_info()[1].__context__)
97            else:
98                print(True)
99        print(sys.exc_info()[0] is AttributeError or sys.exc_info()[0])
100    print(sys.exc_info()[0] is outer_exc or sys.exc_info()[0])
101
102
103def test_c2():
104    try:
105        raise Exception
106    except Exception:
107        test_c(Exception)
108        print(sys.exc_info()[0] is Exception or sys.exc_info()[0])
109    print(sys.exc_info()[0] is None or sys.exc_info()[0])
110