Issue #9815: assertRaises now tries to clear references to local variables in the exception's traceback.

This commit is contained in:
Antoine Pitrou 2014-04-29 01:25:07 +02:00
commit b1e58440f8
3 changed files with 37 additions and 0 deletions

View File

@ -9,6 +9,7 @@ import re
import warnings
import collections
import contextlib
import traceback
from . import result
from .util import (strclass, safe_repr, _count_diff_all_purpose,
@ -178,6 +179,8 @@ class _AssertRaisesContext(_AssertRaisesBaseContext):
self.obj_name))
else:
self._raiseFailure("{} not raised".format(exc_name))
else:
traceback.clear_frames(tb)
if not issubclass(exc_type, self.expected):
# let unexpected exceptions pass through
return False

View File

@ -1,5 +1,6 @@
import datetime
import warnings
import weakref
import unittest
from itertools import product
@ -97,6 +98,36 @@ class Test_Assertions(unittest.TestCase):
else:
self.fail("assertRaises() didn't let exception pass through")
def test_assertRaises_frames_survival(self):
# Issue #9815: assertRaises should avoid keeping local variables
# in a traceback alive.
class A:
pass
wr = None
class Foo(unittest.TestCase):
def foo(self):
nonlocal wr
a = A()
wr = weakref.ref(a)
try:
raise IOError
except IOError:
raise ValueError
def test_functional(self):
self.assertRaises(ValueError, self.foo)
def test_with(self):
with self.assertRaises(ValueError):
self.foo()
Foo("test_functional").run()
self.assertIsNone(wr())
Foo("test_with").run()
self.assertIsNone(wr())
def testAssertNotRegex(self):
self.assertNotRegex('Ala ma kota', r'r+')
try:

View File

@ -60,6 +60,9 @@ Core and Builtins
Library
-------
- Issue #9815: assertRaises now tries to clear references to local variables
in the exception's traceback.
- Issue #19940: ssl.cert_time_to_seconds() now interprets the given time
string in the UTC timezone (as specified in RFC 5280), not the local
timezone.