Skip to content

Commit 482b6ee

Browse files
authored
gh-102799: use sys.exception() instead of sys.exc_info() in tests (#103293)
1 parent a44568b commit 482b6ee

12 files changed

+68
-71
lines changed

Lib/test/profilee.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ def helper1():
7979
TICKS += 19
8080
lst = []
8181
lst.append(42) # 0
82-
sys.exc_info() # 0
82+
sys.exception() # 0
8383

8484
def helper2_indirect():
8585
helper2() # 50

Lib/test/support/asyncore.py

+4-3
Original file line numberDiff line numberDiff line change
@@ -537,10 +537,11 @@ def send(self, data):
537537
# ---------------------------------------------------------------------------
538538

539539
def compact_traceback():
540-
t, v, tb = sys.exc_info()
541-
tbinfo = []
540+
exc = sys.exception()
541+
tb = exc.__traceback__
542542
if not tb: # Must have a traceback
543543
raise AssertionError("traceback does not exist")
544+
tbinfo = []
544545
while tb:
545546
tbinfo.append((
546547
tb.tb_frame.f_code.co_filename,
@@ -554,7 +555,7 @@ def compact_traceback():
554555

555556
file, function, line = tbinfo[-1]
556557
info = ' '.join(['[%s|%s|%s]' % x for x in tbinfo])
557-
return (file, function, line), t, v, info
558+
return (file, function, line), type(exc), exc, info
558559

559560
def close_all(map=None, ignore_all=False):
560561
if map is None:

Lib/test/test_asyncio/test_tasks.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ def on_timeout():
606606
if (
607607
timed_out
608608
and task.uncancel() == 0
609-
and sys.exc_info()[0] is asyncio.CancelledError
609+
and type(sys.exception()) is asyncio.CancelledError
610610
):
611611
# Note the five rules that are needed here to satisfy proper
612612
# uncancellation:

Lib/test/test_asyncio/utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ def tearDown(self):
577577

578578
# Detect CPython bug #23353: ensure that yield/yield-from is not used
579579
# in an except block of a generator
580-
self.assertEqual(sys.exc_info(), (None, None, None))
580+
self.assertIsNone(sys.exception())
581581

582582
self.doCleanups()
583583
threading_helper.threading_cleanup(*self._thread_cleanup)

Lib/test/test_class.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ def __init__(self):
457457
a = A()
458458
self.assertEqual(_testcapi.hasattr_string(a, "attr"), True)
459459
self.assertEqual(_testcapi.hasattr_string(a, "noattr"), False)
460-
self.assertEqual(sys.exc_info(), (None, None, None))
460+
self.assertIsNone(sys.exception())
461461

462462
def testDel(self):
463463
x = []

Lib/test/test_cprofile.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ def main():
100100
profilee.py:98(subhelper) <- 8 0.064 0.080 profilee.py:88(helper2)
101101
{built-in method builtins.hasattr} <- 4 0.000 0.004 profilee.py:73(helper1)
102102
8 0.000 0.008 profilee.py:88(helper2)
103-
{built-in method sys.exc_info} <- 4 0.000 0.000 profilee.py:73(helper1)
103+
{built-in method sys.exception} <- 4 0.000 0.000 profilee.py:73(helper1)
104104
{method 'append' of 'list' objects} <- 4 0.000 0.000 profilee.py:73(helper1)"""
105105
_ProfileOutput['print_callees'] = """\
106106
<string>:1(<module>) -> 1 0.270 1.000 profilee.py:25(testfunc)

Lib/test/test_exceptions.py

+32-34
Original file line numberDiff line numberDiff line change
@@ -334,8 +334,7 @@ def test_capi1():
334334
try:
335335
_testcapi.raise_exception(BadException, 1)
336336
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
339338
self.assertEqual(co.co_name, "test_capi1")
340339
self.assertTrue(co.co_filename.endswith('test_exceptions.py'))
341340
else:
@@ -346,8 +345,7 @@ def test_capi2():
346345
try:
347346
_testcapi.raise_exception(BadException, 0)
348347
except RuntimeError as err:
349-
exc, err, tb = sys.exc_info()
350-
tb = tb.tb_next
348+
tb = err.__traceback__.tb_next
351349
co = tb.tb_frame.f_code
352350
self.assertEqual(co.co_name, "__init__")
353351
self.assertTrue(co.co_filename.endswith('test_exceptions.py'))
@@ -888,28 +886,28 @@ def yield_raise():
888886
try:
889887
raise KeyError("caught")
890888
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()
894892
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))
900898

901899
# Same test, but inside an exception handler
902900
try:
903901
raise TypeError("foo")
904902
except TypeError:
905903
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)
911909
del g
912-
self.assertEqual(sys.exc_info()[0], TypeError)
910+
self.assertIsInstance(sys.exception(), TypeError)
913911

914912
def test_generator_leaking2(self):
915913
# See issue 12475.
@@ -924,7 +922,7 @@ def g():
924922
next(it)
925923
except StopIteration:
926924
pass
927-
self.assertEqual(sys.exc_info(), (None, None, None))
925+
self.assertIsNone(sys.exception())
928926

929927
def test_generator_leaking3(self):
930928
# See issue #23353. When gen.throw() is called, the caller's
@@ -933,17 +931,17 @@ def g():
933931
try:
934932
yield
935933
except ZeroDivisionError:
936-
yield sys.exc_info()[1]
934+
yield sys.exception()
937935
it = g()
938936
next(it)
939937
try:
940938
1/0
941939
except ZeroDivisionError as e:
942-
self.assertIs(sys.exc_info()[1], e)
940+
self.assertIs(sys.exception(), e)
943941
gen_exc = it.throw(e)
944-
self.assertIs(sys.exc_info()[1], e)
942+
self.assertIs(sys.exception(), e)
945943
self.assertIs(gen_exc, e)
946-
self.assertEqual(sys.exc_info(), (None, None, None))
944+
self.assertIsNone(sys.exception())
947945

948946
def test_generator_leaking4(self):
949947
# See issue #23353. When an exception is raised by a generator,
@@ -952,39 +950,39 @@ def g():
952950
try:
953951
1/0
954952
except ZeroDivisionError:
955-
yield sys.exc_info()[0]
953+
yield sys.exception()
956954
raise
957955
it = g()
958956
try:
959957
raise TypeError
960958
except TypeError:
961959
# The caller's exception state (TypeError) is temporarily
962960
# saved in the generator.
963-
tp = next(it)
961+
tp = type(next(it))
964962
self.assertIs(tp, ZeroDivisionError)
965963
try:
966964
next(it)
967965
# We can't check it immediately, but while next() returns
968966
# with an exception, it shouldn't have restored the old
969967
# exception state (TypeError).
970968
except ZeroDivisionError as e:
971-
self.assertIs(sys.exc_info()[1], e)
969+
self.assertIs(sys.exception(), e)
972970
# We used to find TypeError here.
973-
self.assertEqual(sys.exc_info(), (None, None, None))
971+
self.assertIsNone(sys.exception())
974972

975973
def test_generator_doesnt_retain_old_exc(self):
976974
def g():
977-
self.assertIsInstance(sys.exc_info()[1], RuntimeError)
975+
self.assertIsInstance(sys.exception(), RuntimeError)
978976
yield
979-
self.assertEqual(sys.exc_info(), (None, None, None))
977+
self.assertIsNone(sys.exception())
980978
it = g()
981979
try:
982980
raise RuntimeError
983981
except RuntimeError:
984982
next(it)
985983
self.assertRaises(StopIteration, next, it)
986984

987-
def test_generator_finalizing_and_exc_info(self):
985+
def test_generator_finalizing_and_sys_exception(self):
988986
# See #7173
989987
def simple_gen():
990988
yield 1
@@ -996,7 +994,7 @@ def run_gen():
996994
return next(gen)
997995
run_gen()
998996
gc_collect()
999-
self.assertEqual(sys.exc_info(), (None, None, None))
997+
self.assertIsNone(sys.exception())
1000998

1001999
def _check_generator_cleanup_exc_state(self, testfunc):
10021000
# Issue #12791: exception state is cleaned up as soon as a generator
@@ -1067,14 +1065,14 @@ def test_3114(self):
10671065
class MyObject:
10681066
def __del__(self):
10691067
nonlocal e
1070-
e = sys.exc_info()
1068+
e = sys.exception()
10711069
e = ()
10721070
try:
10731071
raise Exception(MyObject())
10741072
except:
10751073
pass
10761074
gc_collect() # For PyPy or other GCs.
1077-
self.assertEqual(e, (None, None, None))
1075+
self.assertIsNone(e)
10781076

10791077
def test_raise_does_not_create_context_chain_cycle(self):
10801078
class A(Exception):
@@ -1692,7 +1690,7 @@ def g():
16921690
raise ValueError
16931691
except ValueError:
16941692
yield 1
1695-
self.assertEqual(sys.exc_info(), (None, None, None))
1693+
self.assertIsNone(sys.exception())
16961694
yield 2
16971695

16981696
gen = g()

Lib/test/test_generators.py

+17-17
Original file line numberDiff line numberDiff line change
@@ -234,16 +234,16 @@ class ExceptionTest(unittest.TestCase):
234234
def test_except_throw(self):
235235
def store_raise_exc_generator():
236236
try:
237-
self.assertEqual(sys.exc_info()[0], None)
237+
self.assertIsNone(sys.exception())
238238
yield
239239
except Exception as exc:
240240
# exception raised by gen.throw(exc)
241-
self.assertEqual(sys.exc_info()[0], ValueError)
241+
self.assertIsInstance(sys.exception(), ValueError)
242242
self.assertIsNone(exc.__context__)
243243
yield
244244

245245
# ensure that the exception is not lost
246-
self.assertEqual(sys.exc_info()[0], ValueError)
246+
self.assertIsInstance(sys.exception(), ValueError)
247247
yield
248248

249249
# we should be able to raise back the ValueError
@@ -265,35 +265,35 @@ def store_raise_exc_generator():
265265
next(make)
266266
self.assertIsNone(cm.exception.__context__)
267267

268-
self.assertEqual(sys.exc_info(), (None, None, None))
268+
self.assertIsNone(sys.exception())
269269

270270
def test_except_next(self):
271271
def gen():
272-
self.assertEqual(sys.exc_info()[0], ValueError)
272+
self.assertIsInstance(sys.exception(), ValueError)
273273
yield "done"
274274

275275
g = gen()
276276
try:
277277
raise ValueError
278278
except Exception:
279279
self.assertEqual(next(g), "done")
280-
self.assertEqual(sys.exc_info(), (None, None, None))
280+
self.assertIsNone(sys.exception())
281281

282282
def test_except_gen_except(self):
283283
def gen():
284284
try:
285-
self.assertEqual(sys.exc_info()[0], None)
285+
self.assertIsNone(sys.exception())
286286
yield
287287
# we are called from "except ValueError:", TypeError must
288288
# inherit ValueError in its context
289289
raise TypeError()
290290
except TypeError as exc:
291-
self.assertEqual(sys.exc_info()[0], TypeError)
291+
self.assertIsInstance(sys.exception(), TypeError)
292292
self.assertEqual(type(exc.__context__), ValueError)
293293
# here we are still called from the "except ValueError:"
294-
self.assertEqual(sys.exc_info()[0], ValueError)
294+
self.assertIsInstance(sys.exception(), ValueError)
295295
yield
296-
self.assertIsNone(sys.exc_info()[0])
296+
self.assertIsNone(sys.exception())
297297
yield "done"
298298

299299
g = gen()
@@ -304,7 +304,7 @@ def gen():
304304
next(g)
305305

306306
self.assertEqual(next(g), "done")
307-
self.assertEqual(sys.exc_info(), (None, None, None))
307+
self.assertIsNone(sys.exception())
308308

309309
def test_nested_gen_except_loop(self):
310310
def gen():
@@ -330,19 +330,19 @@ def test_except_throw_exception_context(self):
330330
def gen():
331331
try:
332332
try:
333-
self.assertEqual(sys.exc_info()[0], None)
333+
self.assertIsNone(sys.exception())
334334
yield
335335
except ValueError:
336336
# we are called from "except ValueError:"
337-
self.assertEqual(sys.exc_info()[0], ValueError)
337+
self.assertIsInstance(sys.exception(), ValueError)
338338
raise TypeError()
339339
except Exception as exc:
340-
self.assertEqual(sys.exc_info()[0], TypeError)
340+
self.assertIsInstance(sys.exception(), TypeError)
341341
self.assertEqual(type(exc.__context__), ValueError)
342342
# we are still called from "except ValueError:"
343-
self.assertEqual(sys.exc_info()[0], ValueError)
343+
self.assertIsInstance(sys.exception(), ValueError)
344344
yield
345-
self.assertIsNone(sys.exc_info()[0])
345+
self.assertIsNone(sys.exception())
346346
yield "done"
347347

348348
g = gen()
@@ -353,7 +353,7 @@ def gen():
353353
g.throw(exc)
354354

355355
self.assertEqual(next(g), "done")
356-
self.assertEqual(sys.exc_info(), (None, None, None))
356+
self.assertIsNone(sys.exception())
357357

358358
def test_except_throw_bad_exception(self):
359359
class E(Exception):

Lib/test/test_logging.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -5097,8 +5097,7 @@ def test_encoding_errors_none(self):
50975097
message = []
50985098

50995099
def dummy_handle_error(record):
5100-
_, v, _ = sys.exc_info()
5101-
message.append(str(v))
5100+
message.append(str(sys.exception()))
51025101

51035102
handler.handleError = dummy_handle_error
51045103
logging.debug('The Øresund Bridge joins Copenhagen to Malmö')

Lib/test/test_profile.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ def main():
178178
8 63.976 7.997 79.960 9.995 profilee.py:98(subhelper)"""
179179
_ProfileOutput['print_callers'] = """\
180180
:0(append) <- profilee.py:73(helper1)(4) 119.964
181-
:0(exc_info) <- profilee.py:73(helper1)(4) 119.964
181+
:0(exception) <- profilee.py:73(helper1)(4) 119.964
182182
:0(hasattr) <- profilee.py:73(helper1)(4) 119.964
183183
profilee.py:88(helper2)(8) 399.912
184184
profilee.py:110(__getattr__) <- :0(hasattr)(12) 11.964

Lib/test/test_ssl.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ def wrapper(*args, **kw):
253253

254254

255255
def handle_error(prefix):
256-
exc_format = ' '.join(traceback.format_exception(*sys.exc_info()))
256+
exc_format = ' '.join(traceback.format_exception(sys.exception()))
257257
if support.verbose:
258258
sys.stdout.write(prefix + exc_format)
259259

0 commit comments

Comments
 (0)