From 781faa57341702e108ccb4b94d1afcf0b0cbb4f6 Mon Sep 17 00:00:00 2001 From: inso <insomniak.fr@gmaiL.com> Date: Tue, 12 Jul 2016 21:55:22 +0200 Subject: [PATCH] New error handling --- src/sakia/gui/mainwindow.py | 5 ++++- src/sakia/gui/transfer.py | 1 + src/sakia/main.py | 31 +++++++++++++++++++++++++++++-- 3 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/sakia/gui/mainwindow.py b/src/sakia/gui/mainwindow.py index 95ce58f6..c348d56b 100644 --- a/src/sakia/gui/mainwindow.py +++ b/src/sakia/gui/mainwindow.py @@ -5,8 +5,10 @@ Created on 1 févr. 2014 """ import aiohttp import logging +import traceback -from PyQt5.QtWidgets import QMainWindow, QAction, QFileDialog, QMessageBox, QLabel, QComboBox, QDialog, QApplication +from PyQt5.QtWidgets import QMainWindow, QAction, QFileDialog, \ + QMessageBox, QLabel, QComboBox, QDialog, QApplication, QErrorMessage from PyQt5.QtCore import QLocale, QEvent, \ pyqtSlot, QDateTime, QTimer, Qt, QObject, QUrl from PyQt5.QtGui import QIcon @@ -29,6 +31,7 @@ from ..core.community import Community from ..tools.decorators import asyncify from ..__init__ import __version__ from .widgets import toast +from .widgets.dialogs import QAsyncMessageBox class MainWindow(QObject): diff --git a/src/sakia/gui/transfer.py b/src/sakia/gui/transfer.py index 65e5b14d..acc15964 100644 --- a/src/sakia/gui/transfer.py +++ b/src/sakia/gui/transfer.py @@ -180,6 +180,7 @@ class TransferMoneyDialog(QObject): @asyncify async def relative_amount_changed(self, value): + raise Exception("Test") ud_block = await self.community.get_ud_block() dividend = ud_block['dividend'] base = ud_block['unitbase'] diff --git a/src/sakia/main.py b/src/sakia/main.py index 1ec5f5d1..cebe13e4 100755 --- a/src/sakia/main.py +++ b/src/sakia/main.py @@ -12,12 +12,14 @@ import traceback # To debug missing spec import jsonschema +import traceback # To force cx_freeze import import PyQt5.QtSvg from quamash import QSelectorEventLoop -from PyQt5.QtWidgets import QApplication +from PyQt5.QtWidgets import QApplication, QMessageBox +from PyQt5.QtCore import Qt from sakia.gui.mainwindow import MainWindow from sakia.core.app import Application @@ -55,13 +57,38 @@ def async_exception_handler(loop, context): for ignored in ("Unclosed", "socket.gaierror"): if ignored in line: return - os._exit(1) + exception_message(log_lines, exc_info) + + +def exception_handler(*exc_info): + logging.error("An unhandled exception occured", + exc_info=exc_info) + exception_message(["An unhandled exception occured"], exc_info) + + +def exception_message(log_lines, exc_info): + stacktrace = traceback.format_exception(*exc_info) if exc_info else "" + message = """ + {log_lines} + + ---- + {stacktrace} + """.format(log_lines='\n'.join(log_lines), stacktrace='\n'.join(stacktrace)) + mb = QMessageBox(QMessageBox.Critical, "Critical error", + """A critical error occured. Select the details to display it. + Please report it to <a href=\"https://github.com/duniter/sakia/issues/new\">the developers github</a>""", + QMessageBox.Ok, QApplication.activeWindow()) + mb.setDetailedText(message) + mb.setTextFormat(Qt.RichText) + mb.setTextInteractionFlags(Qt.TextSelectableByMouse) + mb.exec() if __name__ == '__main__': # activate ctrl-c interrupt signal.signal(signal.SIGINT, signal.SIG_DFL) sakia = QApplication(sys.argv) + sys.excepthook = exception_handler sakia.setStyle('Fusion') loop = QSelectorEventLoop(sakia) -- GitLab