From 4b4424ae92d52789b33f6d29e9da9d91155815f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Jastrz=C4=99bski?= Date: Tue, 18 Jun 2013 15:52:21 +0200 Subject: [PATCH] "Crash like professional" - Improved error handling --- kcc/KCC_gui.py | 10 ++++++---- kcc/comic2ebook.py | 10 +++++++++- kcc/image.py | 7 +++++++ 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/kcc/KCC_gui.py b/kcc/KCC_gui.py index e198f4d..cbbbd66 100644 --- a/kcc/KCC_gui.py +++ b/kcc/KCC_gui.py @@ -135,10 +135,8 @@ class WorkerThread(QtCore.QThread): except Exception as err: self.errors = True type_, value_, traceback_ = sys.exc_info() - QtGui.QMessageBox.critical(MainWindow, 'KCC Error', - "Error on file %s:\n%s\nTraceback:\n%s" - % (jobargv[-1], str(err), traceback.format_tb(traceback_)), - QtGui.QMessageBox.Ok) + self.emit(QtCore.SIGNAL("showDialog"), "Error on file %s:\n%s\nTraceback:\n%s" + % (jobargv[-1], str(err), traceback.format_tb(traceback_))) self.emit(QtCore.SIGNAL("addMessage"), 'KCC failed to create EPUB!', 'error') if not self.errors: if str(GUI.FormatBox.currentText()) == 'CBZ': @@ -343,6 +341,9 @@ class Ui_KCC(object): GUI.JobList.addItem(item) GUI.JobList.scrollToBottom() + def showDialog(self, message): + QtGui.QMessageBox.critical(MainWindow, 'KCC Error', message, QtGui.QMessageBox.Ok) + def updateProgressbar(self, new=False, status=False): if new == "status": pass @@ -413,6 +414,7 @@ class Ui_KCC(object): KCC.connect(self.worker, QtCore.SIGNAL("progressBarTick"), self.updateProgressbar) KCC.connect(self.worker, QtCore.SIGNAL("modeConvert"), self.modeConvert) KCC.connect(self.worker, QtCore.SIGNAL("addMessage"), self.addMessage) + KCC.connect(self.worker, QtCore.SIGNAL("showDialog"), self.showDialog) KCC.connect(self.worker, QtCore.SIGNAL("hideProgressBar"), self.hideProgressBar) KCC.connect(self.versionCheck, QtCore.SIGNAL("addMessage"), self.addMessage) KCC.closeEvent = self.saveSettings diff --git a/kcc/comic2ebook.py b/kcc/comic2ebook.py index 569534e..3fac9ce 100755 --- a/kcc/comic2ebook.py +++ b/kcc/comic2ebook.py @@ -358,7 +358,11 @@ def dirImgProcess(path): GUI.emit(QtCore.SIGNAL("progressBarTick")) pool.join() queue.close() - splitpages = splitpages.get() + try: + splitpages = splitpages.get() + except: + rmtree(path) + raise RuntimeError("One of workers crashed. Cause: " + str(sys.exc_info()[1])) splitpages = filter(None, splitpages) splitpages.sort() for page in splitpages: @@ -572,6 +576,7 @@ def getWorkFolder(afile): sanitizeTreeBeforeConversion(fullPath) return workdir except OSError: + rmtree(workdir) raise elif afile.lower().endswith('.pdf'): pdf = pdfjpgextract.PdfJpgExtract(afile) @@ -582,10 +587,12 @@ def getWorkFolder(afile): try: path = cbx.extract(workdir) except OSError: + rmtree(workdir) print 'Unrar not found, please download from ' + \ 'http://www.rarlab.com/download.htm and put into your PATH.' sys.exit(21) else: + rmtree(workdir) raise TypeError move(path, path + "_temp") move(path + "_temp", os.path.join(path, 'OEBPS', 'Images')) @@ -628,6 +635,7 @@ def sanitizeTreeBeforeConversion(filetree): for root, dirs, files in os.walk(filetree, False): for name in files: os.chmod(os.path.join(root, name), stat.S_IWRITE | stat.S_IREAD) + # Detect corrupted files - Phase 1 if os.path.getsize(os.path.join(root, name)) == 0: os.remove(os.path.join(root, name)) for name in dirs: diff --git a/kcc/image.py b/kcc/image.py index 2b43472..3b9969c 100755 --- a/kcc/image.py +++ b/kcc/image.py @@ -116,11 +116,18 @@ class ComicPage: self.profile_label, self.size, self.palette, self.gamma, self.panelviewsize = device except KeyError: raise RuntimeError('Unexpected output device %s' % device) + # Detect corrupted files - Phase 2 try: self.origFileName = source self.image = Image.open(source) except IOError: raise RuntimeError('Cannot read image file %s' % source) + # Detect corrupted files - Phase 3 + try: + self.image.verify() + except: + raise RuntimeError('Image file %s is corrupted' % source) + self.image = Image.open(source) self.image = self.image.convert('RGB') def saveToDir(self, targetdir, forcepng, color, sufix=None):