From 94dbffdfa7fb14b4145bba566182376782928bc1 Mon Sep 17 00:00:00 2001 From: Daniel Salzman <daniel.salzman@nic.cz> Date: Mon, 9 Jan 2017 12:55:23 +0100 Subject: [PATCH] python/control: raise KnotCtlError instead of general Exception --- python/libknot/control.py | 38 ++++++++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/python/libknot/control.py b/python/libknot/control.py index 45df9ea1ca..f887c8df29 100755 --- a/python/libknot/control.py +++ b/python/libknot/control.py @@ -80,6 +80,22 @@ def load_lib(path="libknot.so"): CTL_ERROR.argtypes = [c_int] +class KnotCtlError(Exception): + """Libknot server control error.""" + + def __init__(self, message, data=None): + """ + @type message: str + @type data: KnotCtlData + """ + + self.message = message + self.data = data + + def __str__(self): + return "message: %s\ndata: %s" % (self.message, self.data) + + class KnotCtlType(IntEnum): """Libknot server control data unit types.""" @@ -113,6 +129,17 @@ class KnotCtlData(object): def __init__(self): self.data = self.DataArray() + def __str__(self): + string = str() + + for idx in KnotCtlDataIdx: + if self.data[idx]: + if string: + string += ", " + string += "%s = %s" % (idx.name, self.data[idx]) + + return string + def __getitem__(self, index): """Data unit item getter. @@ -162,7 +189,7 @@ class KnotCtl(object): ret = CTL_CONNECT(self.obj, path.encode()) if ret != 0: err = CTL_ERROR(ret) - raise Exception(err if isinstance(err, str) else err.decode()) + raise KnotCtlError(err if isinstance(err, str) else err.decode()) def close(self): """Disconnects from the current control socket.""" @@ -180,7 +207,7 @@ class KnotCtl(object): data.data if data else c_char_p()) if ret != 0: err = CTL_ERROR(ret) - raise Exception(err if isinstance(err, str) else err.decode()) + raise KnotCtlError(err if isinstance(err, str) else err.decode()) def receive(self, data=None): """Receives a data unit from the connected control socket. @@ -194,7 +221,7 @@ class KnotCtl(object): data.data if data else c_char_p()) if ret != 0: err = CTL_ERROR(ret) - raise Exception(err if isinstance(err, str) else err.decode()) + raise KnotCtlError(err if isinstance(err, str) else err.decode()) return KnotCtlType(data_type.value) def send_block(self, cmd, section=None, item=None, identifier=None, zone=None, @@ -344,7 +371,7 @@ class KnotCtl(object): # Check for an error. if reply[KnotCtlDataIdx.ERROR]: - raise Exception(reply[KnotCtlDataIdx.ERROR]) + raise KnotCtlError(reply[KnotCtlDataIdx.ERROR], reply) self._receive_stats(out, reply) @@ -361,14 +388,13 @@ class KnotCtl(object): while True: reply = KnotCtlData() reply_type = self.receive(reply) - # Stop if not data type. if reply_type not in [KnotCtlType.DATA, KnotCtlType.EXTRA]: break # Check for an error. if reply[KnotCtlDataIdx.ERROR]: - raise Exception(reply[KnotCtlDataIdx.ERROR]) + raise KnotCtlError(reply[KnotCtlDataIdx.ERROR], reply) # Check for config data. if reply[KnotCtlDataIdx.SECTION]: -- GitLab