]> kaliko git repositories - mpd-sima.git/commitdiff
Some refactoring around Exceptions
authorkaliko <kaliko@azylum.org>
Sat, 2 Oct 2021 11:09:01 +0000 (13:09 +0200)
committerkaliko <kaliko@azylum.org>
Sat, 2 Oct 2021 11:09:01 +0000 (13:09 +0200)
sima/core.py
sima/lib/http.py
sima/lib/meta.py
sima/lib/simadb.py
sima/lib/simafm.py
sima/mpdclient.py
sima/plugins/internal/tags.py
sima/utils/filelock.py
sima/utils/utils.py

index eb01031c417f0e8ff44cf872b7ac3286991a89a1..83c5e910a54adae79fc860b199a6c9913792bbdd 100644 (file)
@@ -129,9 +129,6 @@ class Sima(Daemon):
             except PlayerError as err:
                 self.log.debug(err)
                 continue
-            except PlayerError as err:
-                # TODO: unhandled Player exceptions
-                self.log.warning('Unhandled player exception: %s', err)
             self.log.info('Got reconnected')
             break
         self.foreach_plugin('start')
index 949b306f1f651c8ac3429d0de3dbaa0ba9658861..3b27bddbb3e99406f909681bd03da234a3be54ce 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Copyright (c) 2014-2015, 2020 kaliko <kaliko@azylum.org>
+# Copyright (c) 2014-2015, 2020, 2021 kaliko <kaliko@azylum.org>
 # Copyright (c) 2012, 2013 Eric Larson <eric@ionrock.org>
 #
 #   This program is free software: you can redistribute it and/or modify
@@ -26,7 +26,7 @@ import time
 
 import email.utils
 
-from requests import Session, Request, Timeout, ConnectionError
+from requests import Session, Request, Timeout, ConnectionError as HTTPConnectionError
 
 from sima import SOCKET_TIMEOUT, WAIT_BETWEEN_REQUESTS
 from sima.utils.utils import WSError, WSTimeout, WSHTTPError, Throttle
@@ -293,11 +293,11 @@ class HttpClient:
             return cached_response
         try:
             return self.fetch_ws(req)
-        except Timeout:
+        except Timeout as err:
             raise WSTimeout('Failed to reach server within {0}s'.format(
-                SOCKET_TIMEOUT))
-        except ConnectionError as err:
-            raise WSError(err)
+                SOCKET_TIMEOUT)) from err
+        except HTTPConnectionError as err:
+            raise WSError(err) from err
 
     @Throttle(WAIT_BETWEEN_REQUESTS)
     def fetch_ws(self, prepreq):
index f118e82dcfd19c7dce1b3d426ff2c6dd0c08485c..4ff560110d0b3e1186f1d7fd497beb2f758f7450 100644 (file)
@@ -26,6 +26,9 @@ from collections.abc import Set
 import logging
 import re
 
+from ..utils.utils import MPDSimaException
+
+
 UUID_RE = r'^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[89AB][a-f0-9]{3}-[a-f0-9]{12}$'
 #: The Track Object is collapsing multiple tags into a single string using this
 # separator. It is used then to split back the string to tags list.
@@ -44,7 +47,7 @@ def is_uuid4(uuid):
     return False
 
 
-class MetaException(Exception):
+class MetaException(MPDSimaException):
     """Generic Meta Exception"""
 
 
index 75119aafbd94c0d473531db32f936b26be6cff05..f3c1a09ebe26d3fb5849551e7e2c0ccd44a2a714 100644 (file)
@@ -33,9 +33,10 @@ from datetime import timezone
 
 from sima.lib.meta import Artist, Album
 from sima.lib.track import Track
+from sima.utils.utils import MPDSimaException
 
 
-class SimaDBError(Exception):
+class SimaDBError(MPDSimaException):
     """
     Exceptions.
     """
index bd203f74f3330f1da06a0d7abd5d1f0c741e8a0b..bdfd02d0c3f50e5c866d727066521977d0b7650d 100644 (file)
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-# Copyright (c) 2009-2014 kaliko <kaliko@azylum.org>
+# Copyright (c) 2009-2014, 2021 kaliko <kaliko@azylum.org>
 #
 #   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
@@ -101,9 +101,9 @@ class SimaFM:
         ans = self.http(self.root_url, payload)
         try:
             ans.json()
-        except ValueError:
+        except ValueError as err:
             # Corrupted/malformed cache? cf. gitlab issue #35
-            raise WSError('Malformed json, try purging the cache: %s')
+            raise WSError('Malformed json, try purging the cache: %s') from err
         self._controls_answer(ans.json())  # pylint: disable=no-member
         # Artist might be found but return no 'artist' list…
         # cf. "Mulatu Astatqe" vs. "Mulatu Astatqé" with autocorrect=0
index 1347edd64a85dee116c6863572fb4cd824127986..53a62d0ceddfe9bd74584494a210584e37c3f719 100644 (file)
@@ -23,7 +23,7 @@ from logging import getLogger
 from select import select
 
 # external module
-from musicpd import MPDClient, MPDError as PlayerError
+from musicpd import MPDClient, MPDError
 
 
 # local import
@@ -31,6 +31,11 @@ from .lib.meta import Meta, Artist, Album
 from .lib.track import Track
 from .lib.simastr import SimaStr
 from .utils.leven import levenshtein_ratio
+from .utils.utils import MPDSimaException
+
+
+class PlayerError(MPDSimaException):
+    """Fatal error in the player."""
 
 
 # Some decorators
@@ -124,7 +129,7 @@ class MPD(MPDClient):
                 return tracks_wrapper(super().__getattr__(cmd))
             return super().__getattr__(cmd)
         except OSError as err:
-            raise PlayerError(err)
+            raise PlayerError(err) from err
 
     def disconnect(self):
         """Overriding explicitly MPDClient.disconnect()"""
@@ -144,19 +149,19 @@ class MPD(MPDClient):
         # Catch socket errors
         except OSError as err:
             raise PlayerError('Could not connect to "%s:%s": %s' %
-                              (host, port, err.strerror))
+                              (host, port, err.strerror)) from err
         # Catch all other possible errors
         # ConnectionError and ProtocolError are always fatal.  Others may not
         # be, but we don't know how to handle them here, so treat them as if
         # they are instead of ignoring them.
-        except PlayerError as err:
+        except MPDError as err:
             raise PlayerError('Could not connect to "%s:%s": %s' %
-                              (host, port, err))
+                              (host, port, err)) from err
         if password:
             try:
                 self.password(password)
-            except (PlayerError, OSError) as err:
-                raise PlayerError("Could not connect to '%s': %s" % (host, err))
+            except (MPDError, OSError) as err:
+                raise PlayerError("Could not connect to '%s': %s" % (host, err)) from err
         # Controls we have sufficient rights
         available_cmd = self.commands()
         for cmd in MPD.needed_cmds:
@@ -244,11 +249,11 @@ class MPD(MPDClient):
                 if 'database' in ret:
                     self._reset_cache()
                 return ret
-            else:
-                try:  # noidle cmd does not go through __getattr__, need to catch OSError then
-                    self.noidle()
-                except OSError as err:
-                    raise PlayerError(err)
+            #  Nothing to read, canceling idle
+            try:  # noidle cmd does not go through __getattr__, need to catch OSError then
+                self.noidle()
+            except OSError as err:
+                raise PlayerError(err) from err
 
     def clean(self):
         """Clean blocking event (idle) and pending commands
index 5e5d08ce08108f07f524cf9310dfe626420b7742..39ac0ea27bdb6aacc77307f246240d47d36aab11 100644 (file)
@@ -117,9 +117,9 @@ class Tags(AdvancedPlugin):
             if self.plugin_conf['filter']:
                 # Use window to limit response size
                 self.player.find(self.plugin_conf['filter'], "window", (0, 1))
-        except CommandError:
+        except CommandError as err:
             raise PluginException('Badly formated filter in tags plugin configuration: "%s"'
-                                  % self.plugin_conf['filter'])
+                                  % self.plugin_conf['filter']) from err
 
     def callback_need_track(self):
         candidates = []
index 959f6362d977503718d6c6e37c3addbcba6d771b..31df146831aeb5e8ea06497ea851fbfdf2dc3bf3 100644 (file)
@@ -65,7 +65,7 @@ class FileLock:
                 if err.errno != errno.EEXIST:
                     raise
                 if (time.time() - start_time) >= self.timeout:
-                    raise FileLockException('Timeout occured.')
+                    raise FileLockException('Timeout occured.') from err
                 time.sleep(self.delay)
         self.is_locked = True
 
index d226ef08303bf3fde53064743b73781e3e868158..83799e0e2555b75f94051b04aec9c912a45e226e 100644 (file)
@@ -100,10 +100,6 @@ def exception_log():
     sys.exit(1)
 
 
-class SigHup(Exception):
-    """SIGHUP raises this Exception"""
-
-
 # ArgParse Callbacks
 class Obsolete(Action):
     # pylint: disable=R0903
@@ -193,6 +189,10 @@ class MPDSimaException(Exception):
     """Generic MPD_sima Exception"""
 
 
+class SigHup(MPDSimaException):
+    """SIGHUP raises this Exception"""
+
+
 # http client exceptions (for webservices)
 class WSError(MPDSimaException):
     pass