diff --git a/nw/error.py b/nw/error.py new file mode 100644 index 00000000..dd0cb109 --- /dev/null +++ b/nw/error.py @@ -0,0 +1,89 @@ +# -*- coding: utf-8 -*- +"""novelWriter Init + + novelWriter – Exception Handling +================================== + Error handling functions + + File History: + Created: 2020-08-02 [0.10.2] + + This file is a part of novelWriter + Copyright 2020, Veronica Berglyd Olsen + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +""" + +def formatHtmlErrMsg(exType, exValue, exTrace): + """Generates a HTML version of an exception. + """ + try: + from traceback import format_tb + from nw import __issuesurl__ + + fmtTrace = "" + for trEntry in format_tb(exTrace): + for trLine in trEntry.split("\n"): + stripLine = trLine.lstrip(" ") + nIndent = len(trLine) - len(stripLine) + fmtTrace += " "*nIndent + stripLine + "
" + + theMessage = ( + "

Please report this error by submitting an issue report on " + "GitHub, providing a description and this error message.

" + "

Issue Tracker
%s

" + "

Error Type
%s: %s

" + "

Traceback
%s

" + ) % (__issuesurl__, exType.__name__, str(exValue), fmtTrace) + + return theMessage + + except Exception as e: + return "Could not generate error message.
%s" % str(e) + + return "Could not generate error message." + + +def exceptionHandler(exType, exValue, exTrace): + """Function to catch unhandled global exceptions. + """ + import logging + from traceback import print_tb, format_tb + from nw import __issuesurl__ + from PyQt5.QtWidgets import qApp, QApplication, QErrorMessage, QMessageBox + + logger = logging.getLogger(__name__) + logger.error("%s: %s" % (exType.__name__, str(exValue))) + print_tb(exTrace) + + try: + nwGUI = None + for qWin in qApp.topLevelWidgets(): + if qWin.objectName() == "GuiMain": + nwGUI = qWin + break + + if nwGUI is None: + logger.warning("Could not find main GUI window so cannot open error dialog") + return + + errMsg = QErrorMessage(nwGUI) + errMsg.setWindowTitle("Unhandled Error") + errMsg.resize(800, 400) + errMsg.showMessage(( + "

An unhandled error has been encountered

%s" + ) % formatHtmlErrMsg(exType, exValue, exTrace)) + + except Exception as e: + logger.error(str(e))