From 2a9e09d2d305af9ac172f14ba37ca12ec1836e96 Mon Sep 17 00:00:00 2001 From: Martin Date: Mon, 16 Aug 2010 00:18:59 +0100 Subject: [PATCH] Avoid exc_info cycles in several places and comment on trickier ones --- testtools/run.py | 4 +--- testtools/runtest.py | 7 +++++-- testtools/testcase.py | 16 ++++++++++++---- testtools/tests/helpers.py | 1 + 4 files changed, 19 insertions(+), 9 deletions(-) diff --git a/testtools/run.py b/testtools/run.py index b6f2c49..091c3c7 100755 --- a/testtools/run.py +++ b/testtools/run.py @@ -187,9 +187,7 @@ class TestProgram(object): self.testNames = (self.defaultTest,) self.createTests() except getopt.error: - exc_info = sys.exc_info() - msg = exc_info[1] - self.usageExit(msg) + self.usageExit(sys.exc_info()[1]) def createTests(self): if self.testNames is None: diff --git a/testtools/runtest.py b/testtools/runtest.py index 3495493..898bd12 100644 --- a/testtools/runtest.py +++ b/testtools/runtest.py @@ -146,8 +146,11 @@ class RunTest(object): raise except: exc_info = sys.exc_info() - e = exc_info[1] - self.case.onException(exc_info) + try: + e = exc_info[1] + self.case.onException(exc_info) + finally: + del exc_info for exc_class, handler in self.handlers: if isinstance(e, exc_class): self._exceptions.append(e) diff --git a/testtools/testcase.py b/testtools/testcase.py index 53bea40..dc30279 100644 --- a/testtools/testcase.py +++ b/testtools/testcase.py @@ -179,8 +179,11 @@ class TestCase(unittest.TestCase): raise except: exc_info = sys.exc_info() - self._report_traceback(exc_info) - last_exception = exc_info[1] + try: + self._report_traceback(exc_info) + last_exception = exc_info[1] + finally: + del exc_info return last_exception def addCleanup(self, function, *arguments, **keywordArguments): @@ -319,9 +322,14 @@ class TestCase(unittest.TestCase): try: predicate(*args, **kwargs) except self.failureException: + # GZ 2010-08-12: Don't know how to avoid exc_info cycle as the new + # unittest _ExpectedFailure wants old traceback exc_info = sys.exc_info() - self._report_traceback(exc_info) - raise _ExpectedFailure(exc_info) + try: + self._report_traceback(exc_info) + raise _ExpectedFailure(exc_info) + finally: + del exc_info else: raise _UnexpectedSuccess(reason) diff --git a/testtools/tests/helpers.py b/testtools/tests/helpers.py index c4cf10c..1b836c4 100644 --- a/testtools/tests/helpers.py +++ b/testtools/tests/helpers.py @@ -12,6 +12,7 @@ __all__ = [ from testtools import TestResult +# GZ 2010-08-12: Don't do this, pointlessly creates an exc_info cycle try: raise Exception except Exception: