From be99c597255ede9b2e9f17239b911b8452cdd382 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Thu, 17 Jul 2014 15:34:00 +0200 Subject: [PATCH] Properly handle exceptions other than a non-zero return code for slicing and timelapse rendering Closes #508 --- src/octoprint/slicers/cura/__init__.py | 19 +++++++++++++------ src/octoprint/timelapse.py | 20 ++++++++++++-------- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/octoprint/slicers/cura/__init__.py b/src/octoprint/slicers/cura/__init__.py index 3467b208..083a3f03 100644 --- a/src/octoprint/slicers/cura/__init__.py +++ b/src/octoprint/slicers/cura/__init__.py @@ -1,3 +1,5 @@ +import sarge + __author__ = "Ross Hendrickson savorywatt" __license__ = 'GNU Affero General Public License http://www.gnu.org/licenses/agpl.html' @@ -49,14 +51,19 @@ class Cura(object): import threading def start_thread(call_back, call_back_args, call_args, cwd): - import subprocess self._logger.info("Running %r in %s" % (call_args, cwd)) + command = " ".join(call_args) try: - subprocess.check_call(call_args, cwd=cwd) - call_back(*call_back_args) - except subprocess.CalledProcessError as (e): - self._logger.warn("Could not slice via Cura, got return code %r" % e.returncode) - call_back_args.append("Got returncode %r" % e.returncode) + p = sarge.run(command, cwd=cwd) + if p.returncode == 0: + call_back(*call_back_args) + else: + self._logger.warn("Could not slice via Cura, got return code %r" % p.returncode) + call_back_args.append("Got returncode %r" % p.returncode) + call_back(*call_back_args) + except: + self._logger.exception("Could not slice via Cura, got an unknown error") + call_back_args.append("Unknown error, please consult the log file") call_back(*call_back_args) executable = self.cura_path diff --git a/src/octoprint/timelapse.py b/src/octoprint/timelapse.py index 0c4f4540..0e35a291 100644 --- a/src/octoprint/timelapse.py +++ b/src/octoprint/timelapse.py @@ -305,14 +305,18 @@ class Timelapse(object): command_str = " ".join(command) self._logger.debug("Executing command: %s" % command_str) - p = sarge.run(command_str, stderr=sarge.Capture()) - if p.returncode == 0: - eventManager().fire(Events.MOVIE_DONE, {"gcode": self._gcodeFile, "movie": output, "movie_basename": os.path.basename(output)}) - else: - returncode = p.returncode - stderr_text = p.stderr.text - self._logger.warn("Could not render movie, got return code %r: %s" % (returncode, stderr_text)) - eventManager().fire(Events.MOVIE_FAILED, {"gcode": self._gcodeFile, "movie": output, "movie_basename": os.path.basename(output), "returncode": returncode, "error": stderr_text}) + try: + p = sarge.run(command_str, stderr=sarge.Capture()) + if p.returncode == 0: + eventManager().fire(Events.MOVIE_DONE, {"gcode": self._gcodeFile, "movie": output, "movie_basename": os.path.basename(output)}) + else: + returncode = p.returncode + stderr_text = p.stderr.text + self._logger.warn("Could not render movie, got return code %r: %s" % (returncode, stderr_text)) + eventManager().fire(Events.MOVIE_FAILED, {"gcode": self._gcodeFile, "movie": output, "movie_basename": os.path.basename(output), "returncode": returncode, "error": stderr_text}) + except: + self._logger.exception("Could not render movie due to unknown error") + eventManager().fire(Events.MOVIE_FAILED, {"gcode": self._gcodeFile, "movie": output, "movie_basename": os.path.basename(output), "returncode": 255, "error": "Unknown error"}) def cleanCaptureDir(self): if not os.path.isdir(self._captureDir):