diff options
-rw-r--r-- | coverage/execfile.py | 16 | ||||
-rw-r--r-- | tests/test_process.py | 7 |
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) |