From c949ffe62b68faca0e4d54aeb9171a41a7a62f05 Mon Sep 17 00:00:00 2001
From: inso <insomniak.fr@gmaiL.com>
Date: Wed, 21 Feb 2018 23:06:08 +0100
Subject: [PATCH] Silence unworrying exceptions

---
 src/sakia/data/connectors/node.py | 43 +++++++++++++++++++------------
 src/sakia/main.py                 | 28 ++++++++++++++++++--
 2 files changed, 53 insertions(+), 18 deletions(-)

diff --git a/src/sakia/data/connectors/node.py b/src/sakia/data/connectors/node.py
index 39da3cb5..af0a5dc2 100644
--- a/src/sakia/data/connectors/node.py
+++ b/src/sakia/data/connectors/node.py
@@ -113,10 +113,10 @@ class NodeConnector(QObject):
             else:
                 raise
         except (ClientError, gaierror, TimeoutError, ConnectionRefusedError, ValueError) as e:
-            self._logger.debug("{0}".format(str(e)))
+            self._logger.debug("{:}:{:}".format(str(e.__class__.__name__), str(e)))
             self.change_state_and_emit(Node.OFFLINE)
         except jsonschema.ValidationError as e:
-            self._logger.debug(str(e))
+            self._logger.debug("{:}:{:}".format(str(e.__class__.__name__), str(e)))
             self.change_state_and_emit(Node.CORRUPTED)
         except RuntimeError:
             if self.session.closed:
@@ -187,8 +187,7 @@ class NodeConnector(QObject):
                     self._logger.debug("{0} : {1}".format(str(e), self.node.pubkey[:5]))
                     self.change_state_and_emit(Node.OFFLINE)
                 except jsonschema.ValidationError as e:
-                    self._logger.debug(str(e))
-                    self._logger.debug("Validation error")
+                    self._logger.debug("{:}:{:}".format(str(e.__class__.__name__), str(e)))
                     self.change_state_and_emit(Node.CORRUPTED)
                 except RuntimeError:
                     if self.session.closed:
@@ -220,8 +219,11 @@ class NodeConnector(QObject):
                     self.change_state_and_emit(Node.CORRUPTED)
                     self._logger.debug("Error in block reply :  {0}".format(str(e)))
         else:
-            self._logger.debug("Could not connect to any BMA endpoint")
-            self.change_state_and_emit(Node.OFFLINE)
+            if self.session.closed:
+                pass
+            else:
+                self._logger.debug("Could not connect to any BMA endpoint")
+                self.change_state_and_emit(Node.OFFLINE)
 
     async def refresh_block(self, block_data):
         """
@@ -258,8 +260,11 @@ class NodeConnector(QObject):
                                                                         block_data['number']))
                         self.changed.emit()
             else:
-                self._logger.debug("Could not connect to any BMA endpoint")
-                self.change_state_and_emit(Node.OFFLINE)
+                if self.session.closed:
+                    pass
+                else:
+                    self._logger.debug("Could not connect to any BMA endpoint")
+                    self.change_state_and_emit(Node.OFFLINE)
         else:
             self.change_state_and_emit(Node.ONLINE)
 
@@ -283,8 +288,11 @@ class NodeConnector(QObject):
                 self._logger.debug("Error in summary : {:}".format(str(e)))
                 self.change_state_and_emit(Node.OFFLINE)
         else:
-            self._logger.debug("Could not connect to any BMA endpoint")
-            self.change_state_and_emit(Node.OFFLINE)
+            if self.session.closed:
+                pass
+            else:
+                self._logger.debug("Could not connect to any BMA endpoint")
+                self.change_state_and_emit(Node.OFFLINE)
 
     async def connect_peers(self):
         """
@@ -314,10 +322,10 @@ class NodeConnector(QObject):
                                        .format(type(e).__name__, str(e)))
                     await self.request_peers()
                 except (ClientError, gaierror, TimeoutError) as e:
-                    self._logger.debug("{0}".format(str(e)))
+                    self._logger.debug("{:}:{:}".format(str(e.__class__.__name__), str(e)))
                     self.change_state_and_emit(Node.OFFLINE)
                 except jsonschema.ValidationError as e:
-                    self._logger.debug(str(e))
+                    self._logger.debug("{:}:{:}".format(str(e.__class__.__name__), str(e)))
                     self.change_state_and_emit(Node.CORRUPTED)
                 except RuntimeError:
                     if self.session.closed:
@@ -359,7 +367,7 @@ class NodeConnector(QObject):
                             if e.ucode == 2012:
                                 # Since with multinodes, peers or not the same on all nodes, sometimes this request results
                                 # in peer not found error
-                                self._logger.debug(str(e))
+                                self._logger.debug("{:}:{:}".format(str(e.__class__.__name__), str(e)))
                             else:
                                 self.change_state_and_emit(Node.OFFLINE)
                                 self._logger.debug("Incorrect peer data in {leaf} : {err}".format(leaf=leaf_hash, err=str(e)))
@@ -371,8 +379,11 @@ class NodeConnector(QObject):
                 self._logger.debug("Error in peers reply : {0}".format(str(e)))
                 self.change_state_and_emit(Node.OFFLINE)
         else:
-            self._logger.debug("Could not connect to any BMA endpoint")
-            self.change_state_and_emit(Node.OFFLINE)
+            if self.session.closed:
+                pass
+            else:
+                self._logger.debug("Could not connect to any BMA endpoint")
+                self.change_state_and_emit(Node.OFFLINE)
 
     def refresh_peer_data(self, peer_data):
         if "raw" in peer_data:
@@ -382,7 +393,7 @@ class NodeConnector(QObject):
                 peer_doc = Peer.from_signed_raw(str_doc)
                 self.neighbour_found.emit(peer_doc)
             except MalformedDocumentError as e:
-                self._logger.debug(str(e))
+                self._logger.debug("{:}:{:}".format(str(e.__class__.__name__), str(e)))
         else:
             self._logger.debug("Incorrect leaf reply")
 
diff --git a/src/sakia/main.py b/src/sakia/main.py
index 924f16ad..82b42936 100755
--- a/src/sakia/main.py
+++ b/src/sakia/main.py
@@ -18,6 +18,30 @@ from sakia.gui.preferences import PreferencesDialog
 from sakia.gui.widgets import QAsyncMessageBox
 
 
+
+def exit_exception_handler(loop, context):
+    """
+    An exception handler which prints only on debug (used when exiting)
+    :param loop: the asyncio loop
+    :param context: the exception context
+    """
+
+    logging.debug('Exception handler executing')
+    message = context.get('message')
+    if not message:
+        message = 'Unhandled exception in event loop'
+
+    try:
+        exception = context['exception']
+    except KeyError:
+        exc_info = False
+    else:
+        exc_info = (type(exception), exception, exception.__traceback__)
+
+    logging.debug("An unhandled exception occured : {0}".format(message),
+                  exc_info=exc_info)
+
+
 def async_exception_handler(loop, context):
     """
     An exception handler which exits the program if the exception
@@ -85,7 +109,7 @@ def main():
 
     sys.excepthook = exception_handler
 
-    sakia.setStyle('Fusion')
+    #sakia.setStyle('Fusion')
     loop = QSelectorEventLoop(sakia)
     loop.set_exception_handler(async_exception_handler)
     #loop.set_debug(True)
@@ -131,7 +155,7 @@ def main():
             window = MainWindowController.startup(app)
             loop.run_forever()
         try:
-            loop.set_exception_handler(None)
+            loop.set_exception_handler(exit_exception_handler)
             loop.run_until_complete(app.stop_current_profile())
             logging.debug("Application stopped")
         except asyncio.CancelledError:
-- 
GitLab