diff options
author | Ned Batchelder <nedbat@gmail.com> | 2016-12-26 07:14:26 -0500 |
---|---|---|
committer | Ned Batchelder <nedbat@gmail.com> | 2016-12-26 07:14:26 -0500 |
commit | 481c27ae93b627e3f7704bd2ba652c60f61fabdd (patch) | |
tree | 945a4ac75060cc873464cbedf3ec6abcbf79f3bc | |
parent | 8c1d86ef3953af44b410e45f1640693ff15b7a07 (diff) | |
parent | f807c4271e59a8016f15c8ba4763b0c2d92645a9 (diff) | |
download | python-coveragepy-git-481c27ae93b627e3f7704bd2ba652c60f61fabdd.tar.gz |
Merged in andrewhoos/coverage.py (pull request #93)
Explicitely call sys.excepthook
-rw-r--r-- | coverage/execfile.py | 12 | ||||
-rw-r--r-- | tests/test_process.py | 60 |
2 files changed, 71 insertions, 1 deletions
diff --git a/coverage/execfile.py b/coverage/execfile.py index 58b05402..f598c60b 100644 --- a/coverage/execfile.py +++ b/coverage/execfile.py @@ -199,7 +199,17 @@ 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) - raise ExceptionDuringRun(typ, err, tb.tb_next) + # call a custom user excepthook if it is provided + try: + sys.excepthook(typ, err, tb.tb_next) + except SystemExit: + raise + except: + typ, err, tb = sys.exc_info() + raise ExceptionDuringRun(typ, err, tb.tb_next) + else: + sys.exit(1) + finally: # Restore the old __main__, argv, and path. sys.modules['__main__'] = old_main_mod diff --git a/tests/test_process.py b/tests/test_process.py index 57639db7..2e94c19a 100644 --- a/tests/test_process.py +++ b/tests/test_process.py @@ -788,6 +788,66 @@ class ProcessTest(CoverageTest): out = self.run_command("python -m coverage") self.assertIn("Use 'coverage help' for help", out) + def test_excepthook(self): + self.make_file("test_excepthook.py", """\ + import sys + + def excepthook(*args): + print('in excepthook') + + sys.excepthook = excepthook + + raise RuntimeError('Error Outside') + """) + cov_st, cov_out = self.run_command_status("coverage run test_excepthook.py") + py_st, py_out = self.run_command_status("python test_excepthook.py") + self.assertEqual(cov_st, py_st) + self.assertEqual(cov_st, 1) + + self.assertIn("in excepthook", py_out) + self.assertEqual(cov_out, py_out) + + def test_excepthook_exit(self): + self.make_file("test_excepthook_exit.py", """\ + import sys + + def excepthook(*args): + print('in excepthook') + sys.exit(0) + + sys.excepthook = excepthook + + raise RuntimeError('Error Outside') + """) + 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.assertIn("in excepthook", py_out) + self.assertEqual(cov_out, py_out) + + def test_excepthook_throw(self): + self.make_file("test_excepthook_exit.py", """\ + import sys + + def excepthook(*args): + print('in excepthook') + raise RuntimeError('Error Inside') + + sys.excepthook = excepthook + + raise RuntimeError('Error Outside') + """) + 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.assertIn("in excepthook", py_out) + self.assertEqual(cov_out, py_out) + + class AliasedCommandTest(CoverageTest): """Tests of the version-specific command aliases.""" |