diff --git a/src/ctapipe/core/tests/test_traits.py b/src/ctapipe/core/tests/test_traits.py index 06a7e4500e8..c84b0da185f 100644 --- a/src/ctapipe/core/tests/test_traits.py +++ b/src/ctapipe/core/tests/test_traits.py @@ -351,11 +351,11 @@ class MyTool(Tool): run_tool(tool, ["--MyTool.energy=5 m"], raises=True) captured = capsys.readouterr() - assert ( - captured.err.split(":")[-1] - == f" Given quantity is of physical type {u.get_physical_type(5 * u.m)}." - + f" Expected {u.physical.energy}.\n" + expected = ( + f" Given quantity is of physical type {u.get_physical_type(5 * u.m)}." + f" Expected {u.physical.energy}.\n" ) + assert expected in captured.err def test_quantity_none(): diff --git a/src/ctapipe/core/tool.py b/src/ctapipe/core/tool.py index 6325c909b53..40b055e70f6 100644 --- a/src/ctapipe/core/tool.py +++ b/src/ctapipe/core/tool.py @@ -403,6 +403,7 @@ def run(self, argv=None, raises=False): # https://tldp.org/LDP/abs/html/exitcodes.html exit_status = 0 + current_exception = None with self._exit_stack: try: @@ -429,14 +430,13 @@ def run(self, argv=None, raises=False): self.log.info("Finished: %s", self.name) Provenance().finish_activity(activity_name=self.name) except (ToolConfigurationError, TraitError) as err: + current_exception = err self.log.error("%s", err) self.log.error("Use --help for more info") exit_status = 2 # wrong cmd line parameter Provenance().finish_activity( activity_name=self.name, status="error", exit_code=exit_status ) - if raises: - raise except KeyboardInterrupt: self.log.warning("WAS INTERRUPTED BY CTRL-C") exit_status = 130 # Script terminated by Control-C @@ -444,6 +444,7 @@ def run(self, argv=None, raises=False): activity_name=self.name, status="interrupted", exit_code=exit_status ) except Exception as err: + current_exception = err exit_status = getattr(err, "exit_code", 1) if exit_status == 1: self.log.exception("Caught unexpected exception: %s", err) @@ -452,17 +453,14 @@ def run(self, argv=None, raises=False): Provenance().finish_activity( activity_name=self.name, status="error", exit_code=exit_status ) - if raises: - raise except SystemExit as err: exit_status = err.code if exit_status == 0: # Finish normally Provenance().finish_activity(activity_name=self.name) else: - if raises: - raise # Finish with error + current_exception = err self.log.critical( "Caught SystemExit with exit code %s", exit_status ) @@ -474,6 +472,8 @@ def run(self, argv=None, raises=False): finally: if not {"-h", "--help", "--help-all"}.intersection(self.argv): self.write_provenance() + if raises and current_exception: + raise current_exception self.exit(exit_status)