Catch backend exceptions with a helper function

This commit is contained in:
Jens Luetjen 2016-01-30 13:13:38 +01:00
parent 3647df61c8
commit 2401229871

View File

@ -1,7 +1,9 @@
from __future__ import absolute_import, unicode_literals from __future__ import absolute_import, unicode_literals
import contextlib
import logging import logging
from mopidy import exceptions
from mopidy.audio import PlaybackState from mopidy.audio import PlaybackState
from mopidy.compat import urllib from mopidy.compat import urllib
from mopidy.core import listener from mopidy.core import listener
@ -10,6 +12,20 @@ from mopidy.internal import deprecation, models, validation
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@contextlib.contextmanager
def _backend_error_handling(backend, reraise=None):
try:
yield
except exceptions.ValidationError as e:
logger.error('%s backend returned bad data: %s',
backend.actor_ref.actor_class.__name__, e)
except Exception as e:
if reraise and isinstance(e, reraise):
raise
logger.exception('%s backend caused an exception.',
backend.actor_ref.actor_class.__name__)
class PlaybackController(object): class PlaybackController(object):
pykka_traversable = True pykka_traversable = True
@ -259,10 +275,8 @@ class PlaybackController(object):
backend = self._get_backend(next_tl_track) backend = self._get_backend(next_tl_track)
if backend: if backend:
try: with _backend_error_handling(backend):
backend.playback.change_track(next_tl_track.track).get() backend.playback.change_track(next_tl_track.track).get()
except Exception as e:
logger.error('Change track failed: %s', e)
def _on_tracklist_change(self): def _on_tracklist_change(self):
""" """
@ -377,12 +391,12 @@ class PlaybackController(object):
return False return False
backend.playback.prepare_change() backend.playback.prepare_change()
try: track_change_result = False
if not backend.playback.change_track(pending_tl_track.track).get(): with _backend_error_handling(backend):
return False # TODO: test for this path track_change_result = backend.playback.change_track(
except Exception as e: pending_tl_track.track).get()
logger.error('Change track failed: %s', e) if not track_change_result:
return False return False # TODO: test for this path
if state == PlaybackState.PLAYING: if state == PlaybackState.PLAYING:
try: try: