summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Batchelder <nedbat@gmail.com>2016-12-26 07:14:26 -0500
committerNed Batchelder <nedbat@gmail.com>2016-12-26 07:14:26 -0500
commit481c27ae93b627e3f7704bd2ba652c60f61fabdd (patch)
tree945a4ac75060cc873464cbedf3ec6abcbf79f3bc
parent8c1d86ef3953af44b410e45f1640693ff15b7a07 (diff)
parentf807c4271e59a8016f15c8ba4763b0c2d92645a9 (diff)
downloadpython-coveragepy-git-481c27ae93b627e3f7704bd2ba652c60f61fabdd.tar.gz
Merged in andrewhoos/coverage.py (pull request #93)
Explicitely call sys.excepthook
-rw-r--r--coverage/execfile.py12
-rw-r--r--tests/test_process.py60
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."""