Handle internal exception, ignore API error
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Nicolas Duhamel 2021-07-16 10:16:17 +02:00
parent 2528809d17
commit bd529fddda
3 changed files with 28 additions and 1 deletions

View File

@ -50,6 +50,7 @@ def main(\
client.loop_forever() client.loop_forever()
if __name__ == "__main__": if __name__ == "__main__":
#deactivate urllib3 logger too verbose #deactivate urllib3 logger too verbose
logger = logging.getLogger('urllib3') logger = logging.getLogger('urllib3')

View File

@ -31,10 +31,12 @@ class Yamaha:
def available_senarios(self): def available_senarios(self):
return SENARIOS return SENARIOS
@exception_handler
def senario_activate(self, senario: Senario): def senario_activate(self, senario: Senario):
for action in senario.activate: for action in senario.activate:
self.request(action) self.request(action)
@exception_handler
def senario_deactivate(self, senario: Senario): def senario_deactivate(self, senario: Senario):
for action in senario.deactivate: for action in senario.deactivate:
self.request(action) self.request(action)
@ -44,11 +46,17 @@ class Yamaha:
r = self._device.request(request) r = self._device.request(request)
except requests.exceptions.ReadTimeout: except requests.exceptions.ReadTimeout:
raise ConnectionTimeoutError() raise ConnectionTimeoutError()
try:
r_json = r.json() r_json = r.json()
except json.decoder.JSONDecodeError:
raise ApiInvalidResponseError()
if r_json['response_code'] != 0: if r_json['response_code'] != 0:
raise ApiError(r.url, r_json['response_code']) raise ApiError(r.url, r_json['response_code'])
return r_json return r_json
@exception_handler
def search_senario(self, name: str): def search_senario(self, name: str):
for s in self.available_senarios: for s in self.available_senarios:
if s.name() == name.lower(): if s.name() == name.lower():
@ -56,6 +64,7 @@ class Yamaha:
else: else:
return None return None
@exception_handler
def handle_senario(self, client, userdata, msg): def handle_senario(self, client, userdata, msg):
senario_name =msg.payload.decode().lower() senario_name =msg.payload.decode().lower()
@ -73,10 +82,12 @@ class Yamaha:
self._client.publish('yamaha/stat/senario', senario_name) self._client.publish('yamaha/stat/senario', senario_name)
@exception_handler
def handle_senario_available(self, client, userdata, msg): def handle_senario_available(self, client, userdata, msg):
self._client.publish('yamaha/stat/senario/available', self._client.publish('yamaha/stat/senario/available',
json.dumps([s.__name__.lower() for s in self.available_senarios])) json.dumps([s.__name__.lower() for s in self.available_senarios]))
@exception_handler
def handle_volume(self, client, userdata, msg): def handle_volume(self, client, userdata, msg):
param =msg.payload.decode().lower() param =msg.payload.decode().lower()
@ -95,6 +106,7 @@ class Yamaha:
self._client.publish('yamaha/stat/volume', json.dumps(msg)) self._client.publish('yamaha/stat/volume', json.dumps(msg))
@exception_handler
def handle_power(self, client, userdata, msg): def handle_power(self, client, userdata, msg):
param =msg.payload.decode().lower() param =msg.payload.decode().lower()

View File

@ -1,3 +1,4 @@
import logging
class Error(Exception): class Error(Exception):
"""Base class for exceptions in this module.""" """Base class for exceptions in this module."""
@ -8,5 +9,18 @@ class ApiError(Error):
self.request = request_url self.request = request_url
self.response_code = response_code self.response_code = response_code
class ApiInvalidResponseError(Error):
pass
class ConnectionTimeoutError(Error): class ConnectionTimeoutError(Error):
pass pass
def exception_handler(func):
def inner_function(*args, **kwargs):
try:
func(*args, **kwargs)
except Error:
logger = logging.getLogger('')
logger.exception("Internal error occur")
return inner_function