@@ -334,8 +334,7 @@ def test_capi1():
334
334
try :
335
335
_testcapi .raise_exception (BadException , 1 )
336
336
except TypeError as err :
337
- exc , err , tb = sys .exc_info ()
338
- co = tb .tb_frame .f_code
337
+ co = err .__traceback__ .tb_frame .f_code
339
338
self .assertEqual (co .co_name , "test_capi1" )
340
339
self .assertTrue (co .co_filename .endswith ('test_exceptions.py' ))
341
340
else :
@@ -346,8 +345,7 @@ def test_capi2():
346
345
try :
347
346
_testcapi .raise_exception (BadException , 0 )
348
347
except RuntimeError as err :
349
- exc , err , tb = sys .exc_info ()
350
- tb = tb .tb_next
348
+ tb = err .__traceback__ .tb_next
351
349
co = tb .tb_frame .f_code
352
350
self .assertEqual (co .co_name , "__init__" )
353
351
self .assertTrue (co .co_filename .endswith ('test_exceptions.py' ))
@@ -888,28 +886,28 @@ def yield_raise():
888
886
try :
889
887
raise KeyError ("caught" )
890
888
except KeyError :
891
- yield sys .exc_info ()[ 0 ]
892
- yield sys .exc_info ()[ 0 ]
893
- yield sys .exc_info ()[ 0 ]
889
+ yield sys .exception ()
890
+ yield sys .exception ()
891
+ yield sys .exception ()
894
892
g = yield_raise ()
895
- self .assertEqual (next (g ), KeyError )
896
- self .assertEqual (sys .exc_info ()[ 0 ], None )
897
- self .assertEqual (next (g ), KeyError )
898
- self .assertEqual (sys .exc_info ()[ 0 ], None )
899
- self .assertEqual (next (g ), None )
893
+ self .assertIsInstance (next (g ), KeyError )
894
+ self .assertIsNone (sys .exception () )
895
+ self .assertIsInstance (next (g ), KeyError )
896
+ self .assertIsNone (sys .exception () )
897
+ self .assertIsNone (next (g ))
900
898
901
899
# Same test, but inside an exception handler
902
900
try :
903
901
raise TypeError ("foo" )
904
902
except TypeError :
905
903
g = yield_raise ()
906
- self .assertEqual (next (g ), KeyError )
907
- self .assertEqual (sys .exc_info ()[ 0 ] , TypeError )
908
- self .assertEqual (next (g ), KeyError )
909
- self .assertEqual (sys .exc_info ()[ 0 ] , TypeError )
910
- self .assertEqual (next (g ), TypeError )
904
+ self .assertIsInstance (next (g ), KeyError )
905
+ self .assertIsInstance (sys .exception () , TypeError )
906
+ self .assertIsInstance (next (g ), KeyError )
907
+ self .assertIsInstance (sys .exception () , TypeError )
908
+ self .assertIsInstance (next (g ), TypeError )
911
909
del g
912
- self .assertEqual (sys .exc_info ()[ 0 ] , TypeError )
910
+ self .assertIsInstance (sys .exception () , TypeError )
913
911
914
912
def test_generator_leaking2 (self ):
915
913
# See issue 12475.
@@ -924,7 +922,7 @@ def g():
924
922
next (it )
925
923
except StopIteration :
926
924
pass
927
- self .assertEqual (sys .exc_info (), ( None , None , None ))
925
+ self .assertIsNone (sys .exception ( ))
928
926
929
927
def test_generator_leaking3 (self ):
930
928
# See issue #23353. When gen.throw() is called, the caller's
@@ -933,17 +931,17 @@ def g():
933
931
try :
934
932
yield
935
933
except ZeroDivisionError :
936
- yield sys .exc_info ()[ 1 ]
934
+ yield sys .exception ()
937
935
it = g ()
938
936
next (it )
939
937
try :
940
938
1 / 0
941
939
except ZeroDivisionError as e :
942
- self .assertIs (sys .exc_info ()[ 1 ] , e )
940
+ self .assertIs (sys .exception () , e )
943
941
gen_exc = it .throw (e )
944
- self .assertIs (sys .exc_info ()[ 1 ] , e )
942
+ self .assertIs (sys .exception () , e )
945
943
self .assertIs (gen_exc , e )
946
- self .assertEqual (sys .exc_info (), ( None , None , None ))
944
+ self .assertIsNone (sys .exception ( ))
947
945
948
946
def test_generator_leaking4 (self ):
949
947
# See issue #23353. When an exception is raised by a generator,
@@ -952,39 +950,39 @@ def g():
952
950
try :
953
951
1 / 0
954
952
except ZeroDivisionError :
955
- yield sys .exc_info ()[ 0 ]
953
+ yield sys .exception ()
956
954
raise
957
955
it = g ()
958
956
try :
959
957
raise TypeError
960
958
except TypeError :
961
959
# The caller's exception state (TypeError) is temporarily
962
960
# saved in the generator.
963
- tp = next (it )
961
+ tp = type ( next (it ) )
964
962
self .assertIs (tp , ZeroDivisionError )
965
963
try :
966
964
next (it )
967
965
# We can't check it immediately, but while next() returns
968
966
# with an exception, it shouldn't have restored the old
969
967
# exception state (TypeError).
970
968
except ZeroDivisionError as e :
971
- self .assertIs (sys .exc_info ()[ 1 ] , e )
969
+ self .assertIs (sys .exception () , e )
972
970
# We used to find TypeError here.
973
- self .assertEqual (sys .exc_info (), ( None , None , None ))
971
+ self .assertIsNone (sys .exception ( ))
974
972
975
973
def test_generator_doesnt_retain_old_exc (self ):
976
974
def g ():
977
- self .assertIsInstance (sys .exc_info ()[ 1 ] , RuntimeError )
975
+ self .assertIsInstance (sys .exception () , RuntimeError )
978
976
yield
979
- self .assertEqual (sys .exc_info (), ( None , None , None ))
977
+ self .assertIsNone (sys .exception ( ))
980
978
it = g ()
981
979
try :
982
980
raise RuntimeError
983
981
except RuntimeError :
984
982
next (it )
985
983
self .assertRaises (StopIteration , next , it )
986
984
987
- def test_generator_finalizing_and_exc_info (self ):
985
+ def test_generator_finalizing_and_sys_exception (self ):
988
986
# See #7173
989
987
def simple_gen ():
990
988
yield 1
@@ -996,7 +994,7 @@ def run_gen():
996
994
return next (gen )
997
995
run_gen ()
998
996
gc_collect ()
999
- self .assertEqual (sys .exc_info (), ( None , None , None ))
997
+ self .assertIsNone (sys .exception ( ))
1000
998
1001
999
def _check_generator_cleanup_exc_state (self , testfunc ):
1002
1000
# Issue #12791: exception state is cleaned up as soon as a generator
@@ -1067,14 +1065,14 @@ def test_3114(self):
1067
1065
class MyObject :
1068
1066
def __del__ (self ):
1069
1067
nonlocal e
1070
- e = sys .exc_info ()
1068
+ e = sys .exception ()
1071
1069
e = ()
1072
1070
try :
1073
1071
raise Exception (MyObject ())
1074
1072
except :
1075
1073
pass
1076
1074
gc_collect () # For PyPy or other GCs.
1077
- self .assertEqual ( e , ( None , None , None ) )
1075
+ self .assertIsNone ( e )
1078
1076
1079
1077
def test_raise_does_not_create_context_chain_cycle (self ):
1080
1078
class A (Exception ):
@@ -1692,7 +1690,7 @@ def g():
1692
1690
raise ValueError
1693
1691
except ValueError :
1694
1692
yield 1
1695
- self .assertEqual (sys .exc_info (), ( None , None , None ))
1693
+ self .assertIsNone (sys .exception ( ))
1696
1694
yield 2
1697
1695
1698
1696
gen = g ()
0 commit comments