diff --git a/src/sakia/gui/mainwindow.py b/src/sakia/gui/mainwindow.py index 95ce58f6ab7a3a1e0a9e9d3ebc5d812b309326b2..c348d56b97550584ddc78249cf126741d2ffe01a 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 65e5b14db4eaf98e149e3c546c6753f0b8c7cbd4..acc159643de9b9e48736e634f350afb0d90f093a 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 1ec5f5d1cc9311b710f3fc5e84570b8419a6cb09..cebe13e493ef0b15fa554f56ff61d68f70ee7fe2 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)