Add more error handling

Julien LepillerSat Nov 14 03:26:40+0100 2020

6dbcf29

Add more error handling

offlate/ui/editor.py

181181
182182
        worker = []
183183
        for f in files:
184-
            worker.append(ExternalRunnable(f))
184+
            worker.append(ExternalRunnable(self, f))
185185
186-
        worker2 = WatchRunnable(self.project, len(worker))
186+
        worker2 = WatchRunnable(self, self.project, len(worker))
187187
        worker2.signals.finished.connect(self.editedExternals)
188188
        worker2.signals.progress.connect(self.intermediateReloadContent)
189189
        for i in range(0, len(worker)):

446446
        self.setLabels(self.tr("Uploading {}...").format(self.tabs.currentWidget().project.name))
447447
        worker = UploadRunnable(self.tabs.currentWidget())
448448
        worker.signals.finished.connect(self.sent)
449+
        worker.signals.error.connect(self.reportError)
449450
        self.threadpool.start(worker)
450451
451452
    def sent(self, name):

457458
        worker = UpdateRunnable(self.tabs.currentWidget())
458459
        worker.signals.finished.connect(self.updated)
459460
        worker.signals.progress.connect(self.reportProgress)
461+
        worker.signals.error.connect(self.reportError)
460462
        self.threadpool.start(worker)
461463
462464
    def updated(self, name):

468470
    def reportProgress(self, name, progress):
469471
        self.setProgresses(progress)
470472
473+
    def reportError(self, name, error):
474+
        dialog = QMessageBox()
475+
        dialog.setText(error)
476+
        dialog.exec_()
477+
471478
    def setLabels(self, value):
472479
        self.actionLabel.setText(value)
473480
        self.projectManagerWindow.projectManagerWidget.actionLabel.setText(value)

614621
        self.setGeometry(0, 0, 800, 600)
615622
        self.setWindowTitle('Offlate')
616623
617-
class UploadRunnable(QRunnable, RunnableCallback):
618-
    def __init__(self, widget):
624+
class UploadRunnable(RunnableCallback):
625+
    def __init__(self, parent, widget):
619626
        super().__init__()
620627
        self.widget = widget
628+
        self.parent = widget
621629
        self.signals = RunnableSignals()
622630
        self.oldamount = -1
623631
        self.error = None
624632
        self.name = self.widget.project.name
625633
626-
    def run(self):
634+
    def do_run(self):
627635
        self.widget.send()
636+
637+
    def do_finish(self):
628638
        self.signals.finished.emit(self.name)
629639
630-
class UpdateRunnable(QRunnable, RunnableCallback):
640+
class UpdateRunnable(RunnableCallback):
631641
    def __init__(self, widget):
632642
        super().__init__()
633643
        self.widget = widget
644+
        self.parent = widget
634645
        self.signals = RunnableSignals()
635646
        self.oldamount = -1
636647
        self.error = None
637648
        self.name = self.widget.project.name
638649
639-
    def run(self):
650+
    def do_run(self):
640651
        self.widget.update(Interface())
652+
653+
    def do_finish(self):
641654
        self.signals.finished.emit(self.name)
642655
643-
class ExternalRunnable(QRunnable, RunnableCallback):
644-
    def __init__(self, mfile):
656+
class ExternalRunnable(RunnableCallback):
657+
    def __init__(self, parent, mfile):
645658
        super().__init__()
646659
        self.mfile = mfile
660+
        self.parent = parent
647661
        self.signals = RunnableSignals()
648662
        self.oldamount = -1
649663
        self.error = None
650664
        self.name = ""
651665
652-
    def run(self):
653-
        # Try to open file with the default application
654-
        try:
655-
            if platform.system() == 'Darwin':
656-
                subprocess.run(['open', self.mfile])
657-
            elif platform.system() == 'Windows':
658-
                subprocess.run(['start', self.mfile])
659-
            else:
660-
                subprocess.run(['xdg-open', self.mfile])
661-
        except:
662-
            print(sys.exc_info())
663-
            pass
666+
    def do_run(self):
667+
        if platform.system() == 'Darwin':
668+
            subprocess.run(['open', self.mfile])
669+
        elif platform.system() == 'Windows':
670+
            subprocess.run(['start', self.mfile])
671+
        else:
672+
            subprocess.run(['xdg-open', self.mfile])
673+
674+
    def do_finish(self):
664675
        self.signals.finished.emit("")
665676
666677
class MyHandler(FileSystemEventHandler):

671682
    def on_modified(self, event):
672683
        self.parent.signals.progress.emit("", 0)
673684
674-
class WatchRunnable(QRunnable, RunnableCallback):
675-
    def __init__(self, project, size):
685+
class WatchRunnable(RunnableCallback):
686+
    def __init__(self, parent, project, size):
676687
        super().__init__()
688+
        self.parent = parent
677689
        self.project = project
678690
        self.signals = RunnableSignals()
679691
        self.oldamount = -1

689701
        for f in files:
690702
            self.observer.schedule(event_handler, str(Path(f).parent), recursive=True)
691703
692-
    def run(self):
704+
    def do_run(self):
693705
        self.observer.start()
694706
        while self.size > 0:
695707
            sleep(0.2)
696708
        self.observer.stop()
697709
        self.observer.join()
710+
711+
    def do_finish(self):
698712
        self.signals.finished.emit("")
699713
700714
    def stop(self, name):

offlate/ui/manager.py

283283
        worker.signals.finished.connect(self.finishReport)
284284
        self.threadpool.start(worker)
285285
286-
class NewRunnable(QRunnable, RunnableCallback):
286+
class NewRunnable(RunnableCallback):
287287
    def __init__(self, parent, name, lang, system, info):
288288
        super().__init__()
289289
        self.name = name

305305
                    self.info, self.error)
306306
        self.parent.filter()
307307
308-
class EditRunnable(QRunnable, RunnableCallback):
308+
class EditRunnable(RunnableCallback):
309309
    def __init__(self, parent, name, lang, system, info):
310310
        super().__init__()
311311
        self.name = name

offlate/ui/parallel.py

1515
####
1616
1717
from PyQt5.QtCore import *
18+
from PyQt5.QtWidgets import *
19+
1820
from ..formats.exception import UnsupportedFormatException
1921
from ..systems.exception import ProjectNotFoundSystemException
2022
from ..systems.callback import SystemCallback
2123
22-
class RunnableCallback(SystemCallback):
24+
import sys
25+
26+
class RunnableCallback(SystemCallback, QRunnable):
27+
    def run(self):
28+
        try:
29+
            self.do_run()
30+
        except:
31+
            info = sys.exc_info()
32+
            self.reportError(info[1], info[2])
33+
        self.do_finish()
34+
2335
    def reportProgress(self, amount):
2436
        if int(round(amount)) > self.oldamount:
2537
            self.oldamount = int(round(amount))
2638
            self.signals.progress.emit(self.name, amount)
2739
40+
    def reportError(self, error, trace):
41+
        traceback = ''
42+
        while trace is not None:
43+
            traceback = traceback + str(trace.tb_frame) + "\n"
44+
            trace = trace.tb_next
45+
46+
        self.error = self.parent.tr('This action did not complete correctly. \
47+
We received the following error message: {}.\n\nTraceback:\n\n{}\nTry \
48+
again?'.format(error, traceback))
49+
        self.signals.error.emit(self.name, self.error)
50+
2851
    def project_exists(self):
2952
        self.error = self.parent.tr('A project with the same name already exists. \
3053
The new project was not created. You should first remove the same-named project.')