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)