@@ -296,15 +296,15 @@ class PrintExceptionAtExit(object):
296
296
def __init__(self):
297
297
try:
298
298
x = 1 / 0
299
- except Exception:
300
- self.exc_info = sys.exc_info()
301
- # self.exc_info[1] (traceback) contains frames:
299
+ except Exception as e :
300
+ self.exc = e
301
+ # self.exc.__traceback__ contains frames:
302
302
# explicitly clear the reference to self in the current
303
303
# frame to break a reference cycle
304
304
self = None
305
305
306
306
def __del__(self):
307
- traceback.print_exception(* self.exc_info )
307
+ traceback.print_exception(self.exc )
308
308
309
309
# Keep a reference in the module namespace to call the destructor
310
310
# when the module is unloaded
@@ -923,8 +923,8 @@ def check_traceback_format(self, cleanup_func=None):
923
923
from _testcapi import traceback_print
924
924
try :
925
925
self .some_exception ()
926
- except KeyError :
927
- type_ , value , tb = sys . exc_info ()
926
+ except KeyError as e :
927
+ tb = e . __traceback__
928
928
if cleanup_func is not None :
929
929
# Clear the inner frames, not this one
930
930
cleanup_func (tb .tb_next )
@@ -1228,8 +1228,8 @@ def __eq__(self, other):
1228
1228
except UnhashableException :
1229
1229
try :
1230
1230
raise ex1
1231
- except UnhashableException :
1232
- exc_type , exc_val , exc_tb = sys . exc_info ()
1231
+ except UnhashableException as e :
1232
+ exc_val = e
1233
1233
1234
1234
with captured_output ("stderr" ) as stderr_f :
1235
1235
exception_print (exc_val )
@@ -2133,8 +2133,8 @@ def assertEqualExcept(actual, expected, ignore):
2133
2133
def test_extract_tb (self ):
2134
2134
try :
2135
2135
self .last_raises5 ()
2136
- except Exception :
2137
- exc_type , exc_value , tb = sys . exc_info ()
2136
+ except Exception as e :
2137
+ tb = e . __traceback__
2138
2138
def extract (** kwargs ):
2139
2139
return traceback .extract_tb (tb , ** kwargs )
2140
2140
@@ -2160,12 +2160,12 @@ def extract(**kwargs):
2160
2160
def test_format_exception (self ):
2161
2161
try :
2162
2162
self .last_raises5 ()
2163
- except Exception :
2164
- exc_type , exc_value , tb = sys . exc_info ()
2163
+ except Exception as e :
2164
+ exc = e
2165
2165
# [1:-1] to exclude "Traceback (...)" header and
2166
2166
# exception type and value
2167
2167
def extract (** kwargs ):
2168
- return traceback .format_exception (exc_type , exc_value , tb , ** kwargs )[1 :- 1 ]
2168
+ return traceback .format_exception (exc , ** kwargs )[1 :- 1 ]
2169
2169
2170
2170
with support .swap_attr (sys , 'tracebacklimit' , 1000 ):
2171
2171
nolim = extract ()
@@ -2203,8 +2203,8 @@ def inner():
2203
2203
2204
2204
try :
2205
2205
outer ()
2206
- except :
2207
- type_ , value , tb = sys . exc_info ()
2206
+ except BaseException as e :
2207
+ tb = e . __traceback__
2208
2208
2209
2209
# Initial assertion: there's one local in the inner frame.
2210
2210
inner_frame = tb .tb_next .tb_next .tb_next .tb_frame
@@ -2282,8 +2282,8 @@ def deeper():
2282
2282
def test_walk_tb (self ):
2283
2283
try :
2284
2284
1 / 0
2285
- except Exception :
2286
- _ , _ , tb = sys . exc_info ()
2285
+ except Exception as e :
2286
+ tb = e . __traceback__
2287
2287
s = list (traceback .walk_tb (tb ))
2288
2288
self .assertEqual (len (s ), 1 )
2289
2289
@@ -2386,10 +2386,10 @@ def f():
2386
2386
def g ():
2387
2387
try :
2388
2388
f ()
2389
- except :
2390
- return sys . exc_info ()
2389
+ except Exception as e :
2390
+ return e . __traceback__
2391
2391
2392
- exc_info = g ()
2392
+ tb = g ()
2393
2393
2394
2394
class Skip_G (traceback .StackSummary ):
2395
2395
def format_frame_summary (self , frame_summary ):
@@ -2398,7 +2398,7 @@ def format_frame_summary(self, frame_summary):
2398
2398
return super ().format_frame_summary (frame_summary )
2399
2399
2400
2400
stack = Skip_G .extract (
2401
- traceback .walk_tb (exc_info [ 2 ] )).format ()
2401
+ traceback .walk_tb (tb )).format ()
2402
2402
2403
2403
self .assertEqual (len (stack ), 1 )
2404
2404
lno = f .__code__ .co_firstlineno + 1
@@ -2416,17 +2416,17 @@ class TestTracebackException(unittest.TestCase):
2416
2416
def test_smoke (self ):
2417
2417
try :
2418
2418
1 / 0
2419
- except Exception :
2420
- exc_info = sys . exc_info ()
2421
- exc = traceback .TracebackException ( * exc_info )
2419
+ except Exception as e :
2420
+ exc_obj = e
2421
+ exc = traceback .TracebackException . from_exception ( e )
2422
2422
expected_stack = traceback .StackSummary .extract (
2423
- traceback .walk_tb (exc_info [ 2 ] ))
2423
+ traceback .walk_tb (e . __traceback__ ))
2424
2424
self .assertEqual (None , exc .__cause__ )
2425
2425
self .assertEqual (None , exc .__context__ )
2426
2426
self .assertEqual (False , exc .__suppress_context__ )
2427
2427
self .assertEqual (expected_stack , exc .stack )
2428
- self .assertEqual (exc_info [ 0 ] , exc .exc_type )
2429
- self .assertEqual (str (exc_info [ 1 ] ), str (exc ))
2428
+ self .assertEqual (type ( exc_obj ) , exc .exc_type )
2429
+ self .assertEqual (str (exc_obj ), str (exc ))
2430
2430
2431
2431
def test_from_exception (self ):
2432
2432
# Check all the parameters are accepted.
@@ -2435,9 +2435,10 @@ def foo():
2435
2435
try :
2436
2436
foo ()
2437
2437
except Exception as e :
2438
- exc_info = sys .exc_info ()
2438
+ exc_obj = e
2439
+ tb = e .__traceback__
2439
2440
self .expected_stack = traceback .StackSummary .extract (
2440
- traceback .walk_tb (exc_info [ 2 ] ), limit = 1 , lookup_lines = False ,
2441
+ traceback .walk_tb (tb ), limit = 1 , lookup_lines = False ,
2441
2442
capture_locals = True )
2442
2443
self .exc = traceback .TracebackException .from_exception (
2443
2444
e , limit = 1 , lookup_lines = False , capture_locals = True )
@@ -2447,8 +2448,8 @@ def foo():
2447
2448
self .assertEqual (None , exc .__context__ )
2448
2449
self .assertEqual (False , exc .__suppress_context__ )
2449
2450
self .assertEqual (expected_stack , exc .stack )
2450
- self .assertEqual (exc_info [ 0 ] , exc .exc_type )
2451
- self .assertEqual (str (exc_info [ 1 ] ), str (exc ))
2451
+ self .assertEqual (type ( exc_obj ) , exc .exc_type )
2452
+ self .assertEqual (str (exc_obj ), str (exc ))
2452
2453
2453
2454
def test_cause (self ):
2454
2455
try :
@@ -2459,18 +2460,18 @@ def test_cause(self):
2459
2460
exc_context = traceback .TracebackException (* exc_info_context )
2460
2461
cause = Exception ("cause" )
2461
2462
raise Exception ("uh oh" ) from cause
2462
- except Exception :
2463
- exc_info = sys . exc_info ()
2464
- exc = traceback .TracebackException ( * exc_info )
2463
+ except Exception as e :
2464
+ exc_obj = e
2465
+ exc = traceback .TracebackException . from_exception ( e )
2465
2466
expected_stack = traceback .StackSummary .extract (
2466
- traceback .walk_tb (exc_info [ 2 ] ))
2467
+ traceback .walk_tb (e . __traceback__ ))
2467
2468
exc_cause = traceback .TracebackException (Exception , cause , None )
2468
2469
self .assertEqual (exc_cause , exc .__cause__ )
2469
2470
self .assertEqual (exc_context , exc .__context__ )
2470
2471
self .assertEqual (True , exc .__suppress_context__ )
2471
2472
self .assertEqual (expected_stack , exc .stack )
2472
- self .assertEqual (exc_info [ 0 ] , exc .exc_type )
2473
- self .assertEqual (str (exc_info [ 1 ] ), str (exc ))
2473
+ self .assertEqual (type ( exc_obj ) , exc .exc_type )
2474
+ self .assertEqual (str (exc_obj ), str (exc ))
2474
2475
2475
2476
def test_context (self ):
2476
2477
try :
@@ -2480,17 +2481,17 @@ def test_context(self):
2480
2481
exc_info_context = sys .exc_info ()
2481
2482
exc_context = traceback .TracebackException (* exc_info_context )
2482
2483
raise Exception ("uh oh" )
2483
- except Exception :
2484
- exc_info = sys . exc_info ()
2485
- exc = traceback .TracebackException ( * exc_info )
2484
+ except Exception as e :
2485
+ exc_obj = e
2486
+ exc = traceback .TracebackException . from_exception ( e )
2486
2487
expected_stack = traceback .StackSummary .extract (
2487
- traceback .walk_tb (exc_info [ 2 ] ))
2488
+ traceback .walk_tb (e . __traceback__ ))
2488
2489
self .assertEqual (None , exc .__cause__ )
2489
2490
self .assertEqual (exc_context , exc .__context__ )
2490
2491
self .assertEqual (False , exc .__suppress_context__ )
2491
2492
self .assertEqual (expected_stack , exc .stack )
2492
- self .assertEqual (exc_info [ 0 ] , exc .exc_type )
2493
- self .assertEqual (str (exc_info [ 1 ] ), str (exc ))
2493
+ self .assertEqual (type ( exc_obj ) , exc .exc_type )
2494
+ self .assertEqual (str (exc_obj ), str (exc ))
2494
2495
2495
2496
def test_long_context_chain (self ):
2496
2497
def f ():
@@ -2501,12 +2502,12 @@ def f():
2501
2502
2502
2503
try :
2503
2504
f ()
2504
- except RecursionError :
2505
- exc_info = sys . exc_info ()
2505
+ except RecursionError as e :
2506
+ exc_obj = e
2506
2507
else :
2507
2508
self .fail ("Exception not raised" )
2508
2509
2509
- te = traceback .TracebackException ( * exc_info )
2510
+ te = traceback .TracebackException . from_exception ( exc_obj )
2510
2511
res = list (te .format ())
2511
2512
2512
2513
# many ZeroDiv errors followed by the RecursionError
@@ -2524,18 +2525,18 @@ def test_compact_with_cause(self):
2524
2525
finally :
2525
2526
cause = Exception ("cause" )
2526
2527
raise Exception ("uh oh" ) from cause
2527
- except Exception :
2528
- exc_info = sys . exc_info ()
2529
- exc = traceback .TracebackException ( * exc_info , compact = True )
2528
+ except Exception as e :
2529
+ exc_obj = e
2530
+ exc = traceback .TracebackException . from_exception ( exc_obj , compact = True )
2530
2531
expected_stack = traceback .StackSummary .extract (
2531
- traceback .walk_tb (exc_info [ 2 ] ))
2532
+ traceback .walk_tb (exc_obj . __traceback__ ))
2532
2533
exc_cause = traceback .TracebackException (Exception , cause , None )
2533
2534
self .assertEqual (exc_cause , exc .__cause__ )
2534
2535
self .assertEqual (None , exc .__context__ )
2535
2536
self .assertEqual (True , exc .__suppress_context__ )
2536
2537
self .assertEqual (expected_stack , exc .stack )
2537
- self .assertEqual (exc_info [ 0 ] , exc .exc_type )
2538
- self .assertEqual (str (exc_info [ 1 ] ), str (exc ))
2538
+ self .assertEqual (type ( exc_obj ) , exc .exc_type )
2539
+ self .assertEqual (str (exc_obj ), str (exc ))
2539
2540
2540
2541
def test_compact_no_cause (self ):
2541
2542
try :
@@ -2545,37 +2546,37 @@ def test_compact_no_cause(self):
2545
2546
exc_info_context = sys .exc_info ()
2546
2547
exc_context = traceback .TracebackException (* exc_info_context )
2547
2548
raise Exception ("uh oh" )
2548
- except Exception :
2549
- exc_info = sys . exc_info ()
2550
- exc = traceback .TracebackException ( * exc_info , compact = True )
2549
+ except Exception as e :
2550
+ exc_obj = e
2551
+ exc = traceback .TracebackException . from_exception ( e , compact = True )
2551
2552
expected_stack = traceback .StackSummary .extract (
2552
- traceback .walk_tb (exc_info [ 2 ] ))
2553
+ traceback .walk_tb (exc_obj . __traceback__ ))
2553
2554
self .assertEqual (None , exc .__cause__ )
2554
2555
self .assertEqual (exc_context , exc .__context__ )
2555
2556
self .assertEqual (False , exc .__suppress_context__ )
2556
2557
self .assertEqual (expected_stack , exc .stack )
2557
- self .assertEqual (exc_info [ 0 ] , exc .exc_type )
2558
- self .assertEqual (str (exc_info [ 1 ] ), str (exc ))
2558
+ self .assertEqual (type ( exc_obj ) , exc .exc_type )
2559
+ self .assertEqual (str (exc_obj ), str (exc ))
2559
2560
2560
2561
def test_no_refs_to_exception_and_traceback_objects (self ):
2561
2562
try :
2562
2563
1 / 0
2563
- except Exception :
2564
- exc_info = sys . exc_info ()
2564
+ except Exception as e :
2565
+ exc_obj = e
2565
2566
2566
- refcnt1 = sys .getrefcount (exc_info [ 1 ] )
2567
- refcnt2 = sys .getrefcount (exc_info [ 2 ] )
2568
- exc = traceback .TracebackException ( * exc_info )
2569
- self .assertEqual (sys .getrefcount (exc_info [ 1 ] ), refcnt1 )
2570
- self .assertEqual (sys .getrefcount (exc_info [ 2 ] ), refcnt2 )
2567
+ refcnt1 = sys .getrefcount (exc_obj )
2568
+ refcnt2 = sys .getrefcount (exc_obj . __traceback__ )
2569
+ exc = traceback .TracebackException . from_exception ( exc_obj )
2570
+ self .assertEqual (sys .getrefcount (exc_obj ), refcnt1 )
2571
+ self .assertEqual (sys .getrefcount (exc_obj . __traceback__ ), refcnt2 )
2571
2572
2572
2573
def test_comparison_basic (self ):
2573
2574
try :
2574
2575
1 / 0
2575
- except Exception :
2576
- exc_info = sys . exc_info ()
2577
- exc = traceback .TracebackException ( * exc_info )
2578
- exc2 = traceback .TracebackException ( * exc_info )
2576
+ except Exception as e :
2577
+ exc_obj = e
2578
+ exc = traceback .TracebackException . from_exception ( exc_obj )
2579
+ exc2 = traceback .TracebackException . from_exception ( exc_obj )
2579
2580
self .assertIsNot (exc , exc2 )
2580
2581
self .assertEqual (exc , exc2 )
2581
2582
self .assertNotEqual (exc , object ())
@@ -2594,37 +2595,37 @@ def raise_with_locals():
2594
2595
2595
2596
try :
2596
2597
raise_with_locals ()
2597
- except Exception :
2598
- exc_info = sys . exc_info ()
2598
+ except Exception as e :
2599
+ exc_obj = e
2599
2600
2600
- exc = traceback .TracebackException ( * exc_info )
2601
- exc1 = traceback .TracebackException ( * exc_info , limit = 10 )
2602
- exc2 = traceback .TracebackException ( * exc_info , limit = 2 )
2601
+ exc = traceback .TracebackException . from_exception ( exc_obj )
2602
+ exc1 = traceback .TracebackException . from_exception ( exc_obj , limit = 10 )
2603
+ exc2 = traceback .TracebackException . from_exception ( exc_obj , limit = 2 )
2603
2604
2604
2605
self .assertEqual (exc , exc1 ) # limit=10 gets all frames
2605
2606
self .assertNotEqual (exc , exc2 ) # limit=2 truncates the output
2606
2607
2607
2608
# locals change the output
2608
- exc3 = traceback .TracebackException ( * exc_info , capture_locals = True )
2609
+ exc3 = traceback .TracebackException . from_exception ( exc_obj , capture_locals = True )
2609
2610
self .assertNotEqual (exc , exc3 )
2610
2611
2611
2612
# there are no locals in the innermost frame
2612
- exc4 = traceback .TracebackException ( * exc_info , limit = - 1 )
2613
- exc5 = traceback .TracebackException ( * exc_info , limit = - 1 , capture_locals = True )
2613
+ exc4 = traceback .TracebackException . from_exception ( exc_obj , limit = - 1 )
2614
+ exc5 = traceback .TracebackException . from_exception ( exc_obj , limit = - 1 , capture_locals = True )
2614
2615
self .assertEqual (exc4 , exc5 )
2615
2616
2616
2617
# there are locals in the next-to-innermost frame
2617
- exc6 = traceback .TracebackException ( * exc_info , limit = - 2 )
2618
- exc7 = traceback .TracebackException ( * exc_info , limit = - 2 , capture_locals = True )
2618
+ exc6 = traceback .TracebackException . from_exception ( exc_obj , limit = - 2 )
2619
+ exc7 = traceback .TracebackException . from_exception ( exc_obj , limit = - 2 , capture_locals = True )
2619
2620
self .assertNotEqual (exc6 , exc7 )
2620
2621
2621
2622
def test_comparison_equivalent_exceptions_are_equal (self ):
2622
2623
excs = []
2623
2624
for _ in range (2 ):
2624
2625
try :
2625
2626
1 / 0
2626
- except :
2627
- excs .append (traceback .TracebackException ( * sys . exc_info () ))
2627
+ except Exception as e :
2628
+ excs .append (traceback .TracebackException . from_exception ( e ))
2628
2629
self .assertEqual (excs [0 ], excs [1 ])
2629
2630
self .assertEqual (list (excs [0 ].format ()), list (excs [1 ].format ()))
2630
2631
@@ -2640,9 +2641,9 @@ def __eq__(self, other):
2640
2641
except UnhashableException :
2641
2642
try :
2642
2643
raise ex1
2643
- except UnhashableException :
2644
- exc_info = sys . exc_info ()
2645
- exc = traceback .TracebackException ( * exc_info )
2644
+ except UnhashableException as e :
2645
+ exc_obj = e
2646
+ exc = traceback .TracebackException . from_exception ( exc_obj )
2646
2647
formatted = list (exc .format ())
2647
2648
self .assertIn ('UnhashableException: ex2\n ' , formatted [2 ])
2648
2649
self .assertIn ('UnhashableException: ex1\n ' , formatted [6 ])
@@ -2655,11 +2656,10 @@ def recurse(n):
2655
2656
1 / 0
2656
2657
try :
2657
2658
recurse (10 )
2658
- except Exception :
2659
- exc_info = sys .exc_info ()
2660
- exc = traceback .TracebackException (* exc_info , limit = 5 )
2659
+ except Exception as e :
2660
+ exc = traceback .TracebackException .from_exception (e , limit = 5 )
2661
2661
expected_stack = traceback .StackSummary .extract (
2662
- traceback .walk_tb (exc_info [ 2 ] ), limit = 5 )
2662
+ traceback .walk_tb (e . __traceback__ ), limit = 5 )
2663
2663
self .assertEqual (expected_stack , exc .stack )
2664
2664
2665
2665
def test_lookup_lines (self ):
@@ -2706,9 +2706,9 @@ def f():
2706
2706
x = 12
2707
2707
try :
2708
2708
x / 0
2709
- except Exception :
2710
- return sys . exc_info ()
2711
- exc = traceback .TracebackException ( * f (), capture_locals = True )
2709
+ except Exception as e :
2710
+ return e
2711
+ exc = traceback .TracebackException . from_exception ( f (), capture_locals = True )
2712
2712
output = StringIO ()
2713
2713
exc .print (file = output )
2714
2714
self .assertEqual (
@@ -2723,7 +2723,7 @@ def f():
2723
2723
class TestTracebackException_ExceptionGroups (unittest .TestCase ):
2724
2724
def setUp (self ):
2725
2725
super ().setUp ()
2726
- self .eg_info = self ._get_exception_group ()
2726
+ self .eg = self ._get_exception_group ()
2727
2727
2728
2728
def _get_exception_group (self ):
2729
2729
def f ():
@@ -2753,26 +2753,26 @@ def g(v):
2753
2753
except Exception as e :
2754
2754
exc4 = e
2755
2755
raise ExceptionGroup ("eg2" , [exc3 , exc4 ])
2756
- except ExceptionGroup :
2757
- return sys . exc_info ()
2756
+ except ExceptionGroup as eg :
2757
+ return eg
2758
2758
self .fail ('Exception Not Raised' )
2759
2759
2760
2760
def test_exception_group_construction (self ):
2761
- eg_info = self .eg_info
2762
- teg1 = traceback .TracebackException (* eg_info )
2763
- teg2 = traceback .TracebackException .from_exception (eg_info [ 1 ] )
2761
+ eg = self .eg
2762
+ teg1 = traceback .TracebackException (type ( eg ), eg , eg . __traceback__ )
2763
+ teg2 = traceback .TracebackException .from_exception (eg )
2764
2764
self .assertIsNot (teg1 , teg2 )
2765
2765
self .assertEqual (teg1 , teg2 )
2766
2766
2767
2767
def test_exception_group_format_exception_only (self ):
2768
- teg = traceback .TracebackException ( * self .eg_info )
2768
+ teg = traceback .TracebackException . from_exception ( self .eg )
2769
2769
formatted = '' .join (teg .format_exception_only ()).split ('\n ' )
2770
2770
expected = "ExceptionGroup: eg2 (2 sub-exceptions)\n " .split ('\n ' )
2771
2771
2772
2772
self .assertEqual (formatted , expected )
2773
2773
2774
2774
def test_exception_group_format (self ):
2775
- teg = traceback .TracebackException ( * self .eg_info )
2775
+ teg = traceback .TracebackException . from_exception ( self .eg )
2776
2776
2777
2777
formatted = '' .join (teg .format ()).split ('\n ' )
2778
2778
lno_f = self .lno_f
@@ -2884,18 +2884,18 @@ def test_max_group_depth(self):
2884
2884
2885
2885
def test_comparison (self ):
2886
2886
try :
2887
- raise self .eg_info [ 1 ]
2888
- except ExceptionGroup :
2889
- exc_info = sys . exc_info ()
2887
+ raise self .eg
2888
+ except ExceptionGroup as e :
2889
+ exc = e
2890
2890
for _ in range (5 ):
2891
2891
try :
2892
- raise exc_info [ 1 ]
2893
- except :
2894
- exc_info = sys . exc_info ()
2895
- exc = traceback .TracebackException ( * exc_info )
2896
- exc2 = traceback .TracebackException ( * exc_info )
2897
- exc3 = traceback .TracebackException ( * exc_info , limit = 300 )
2898
- ne = traceback .TracebackException ( * exc_info , limit = 3 )
2892
+ raise exc
2893
+ except Exception as e :
2894
+ exc_obj = e
2895
+ exc = traceback .TracebackException . from_exception ( exc_obj )
2896
+ exc2 = traceback .TracebackException . from_exception ( exc_obj )
2897
+ exc3 = traceback .TracebackException . from_exception ( exc_obj , limit = 300 )
2898
+ ne = traceback .TracebackException . from_exception ( exc_obj , limit = 3 )
2899
2899
self .assertIsNot (exc , exc2 )
2900
2900
self .assertEqual (exc , exc2 )
2901
2901
self .assertEqual (exc , exc3 )
0 commit comments