diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py index 57de2959eb..e86e407902 100644 --- a/cura/CrashHandler.py +++ b/cura/CrashHandler.py @@ -5,17 +5,33 @@ import webbrowser from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR, QCoreApplication from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTextEdit + +from UM.Logger import Logger from UM.i18n import i18nCatalog catalog = i18nCatalog("cura") +# List of exceptions that should be considered "fatal" and abort the program. +# These are primarily some exception types that we simply cannot really recover from +# (MemoryError and SystemError) and exceptions that indicate grave errors in the +# code that cause the Python interpreter to fail (SyntaxError, ImportError). +fatal_exception_types = [ + MemoryError, + SyntaxError, + ImportError, + SystemError, +] + def show(exception_type, value, tb): debug_mode = False if QCoreApplication.instance(): debug_mode = QCoreApplication.instance().getCommandLineOption("debug-mode", False) - traceback.print_exception(exception_type, value, tb) + Logger.log("c", "An uncaught exception has occurred!") + for line in traceback.format_exception(exception_type, value, tb): + for part in line.rstrip("\n").split("\n"): + Logger.log("c", part) - if not debug_mode: + if not debug_mode and exception_type not in fatal_exception_types: return application = QCoreApplication.instance() @@ -29,7 +45,7 @@ def show(exception_type, value, tb): label = QLabel(dialog) layout.addWidget(label) - label.setText(catalog.i18nc("@label", "
An uncaught exception has occurred!
Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues
")) + label.setText(catalog.i18nc("@label", "A fatal exception has occurred that we could not recover from!
Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues
")) textarea = QTextEdit(dialog) layout.addWidget(textarea) diff --git a/cura/MachineManagerModel.py b/cura/MachineManagerModel.py index 321f5af486..4667777b68 100644 --- a/cura/MachineManagerModel.py +++ b/cura/MachineManagerModel.py @@ -51,8 +51,7 @@ class MachineManagerModel(QObject): if active_machine_id != "": # An active machine was saved, so restore it. - self.setActiveMachine(active_machine_id) - pass + Application.getInstance().callLater(self.setActiveMachine, active_machine_id) globalContainerChanged = pyqtSignal() activeMaterialChanged = pyqtSignal()