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