summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <ned@nedbatchelder.com>2016-12-26 09:37:47 -0500
committerNed Batchelder <ned@nedbatchelder.com>2016-12-26 09:37:47 -0500
commita110edeb6485fffa3accc4202e6b587f7def85ec (patch)
treeb6bba9cd2efbb1b22b9120a38866f0c03deda855
parentf7b83b4e00512525ff93783f18dc70b7d42ea1e7 (diff)
downloadpython-coveragepy-git-a110edeb6485fffa3accc4202e6b587f7def85ec.tar.gz
Make excepthook execution more accurate. Pypy tests failing
-rw-r--r--coverage/execfile.py16
-rw-r--r--tests/test_process.py7
2 files changed, 17 insertions, 6 deletions
diff --git a/coverage/execfile.py b/coverage/execfile.py
index f598c60b..9ac7181d 100644
--- a/coverage/execfile.py
+++ b/coverage/execfile.py
@@ -185,7 +185,7 @@ def run_python_file(filename, args, package=None, modulename=None, path0=None):
# The user called sys.exit(). Just pass it along to the upper
# layers, where it will be handled.
raise
- except:
+ except Exception:
# Something went wrong while executing the user code.
# Get the exc_info, and pack them into an exception that we can
# throw up to the outer loop. We peel one layer off the traceback
@@ -199,13 +199,21 @@ def run_python_file(filename, args, package=None, modulename=None, path0=None):
# it somehow? https://bitbucket.org/pypy/pypy/issue/1903
getattr(err, '__context__', None)
- # call a custom user excepthook if it is provided
+ # Call the excepthook.
try:
sys.excepthook(typ, err, tb.tb_next)
except SystemExit:
raise
- except:
- typ, err, tb = sys.exc_info()
+ except Exception:
+ # Getting the output right in the case of excepthook
+ # shenanigans is kind of involved.
+ sys.stderr.write("Error in sys.excepthook:\n")
+ typ2, err2, tb2 = sys.exc_info()
+ err2.__suppress_context__ = True
+ if hasattr(err2, "__traceback__"):
+ err2.__traceback__ = err2.__traceback__.tb_next
+ sys.__excepthook__(typ2, err2, tb2.tb_next)
+ sys.stderr.write("\nOriginal exception was:\n")
raise ExceptionDuringRun(typ, err, tb.tb_next)
else:
sys.exit(1)
diff --git a/tests/test_process.py b/tests/test_process.py
index a7148621..86155374 100644
--- a/tests/test_process.py
+++ b/tests/test_process.py
@@ -836,7 +836,10 @@ class ExcepthookTest(CoverageTest):
import sys
def excepthook(*args):
- print('in excepthook')
+ # Write this message to stderr so that we don't have to deal
+ # with interleaved stdout/stderr comparisons in the assertions
+ # in the test.
+ sys.stderr.write('in excepthook\\n')
raise RuntimeError('Error Inside')
sys.excepthook = excepthook
@@ -846,7 +849,7 @@ class ExcepthookTest(CoverageTest):
cov_st, cov_out = self.run_command_status("coverage run test_excepthook_exit.py")
py_st, py_out = self.run_command_status("python test_excepthook_exit.py")
self.assertEqual(cov_st, py_st)
- self.assertEqual(cov_st, 0)
+ self.assertEqual(cov_st, 1)
self.assertIn("in excepthook", py_out)
self.assertEqual(cov_out, py_out)