Unify error handling (a little more)

Change-Id: I81184c64aa4d51d0838df62269eace9e44b511da
This commit is contained in:
Enrico Faulhaber
2016-08-31 11:26:33 +02:00
parent 43d0e600ee
commit f2f39f1287
2 changed files with 54 additions and 109 deletions

View File

@ -201,50 +201,49 @@ class Dispatcher(object):
self.log.debug('-> device is not to be exported!') self.log.debug('-> device is not to be exported!')
return {} return {}
# demo stuff def _setParamValue(self, devname, pname, value):
def _setDeviceValue(self, devobj, value): devobj = self.get_device(devname)
# set the device value. return readback value if devobj is None:
# if return == None -> Ellispis (readonly!) return NoSuchDeviceError(devname)
if self._getDeviceParam(devobj, 'target') != Ellipsis:
return self._setDeviceParam(devobj, 'target', value)
return Ellipsis
def _getDeviceValue(self, devobj): pobj = getattr(devobj.PARAMS, pname, None)
# get the device value if pobj is None:
# if return == None -> Ellipsis return NoSuchParamError(devname, pname)
return self._getDeviceParam(devobj, 'value')
def _setDeviceParam(self, devobj, pname, value):
# set the device param. return readback value
# if return == None -> Ellipsis (readonly!)
pobj = devobj.PARAMS.get(pname, Ellipsis)
if pobj == Ellipsis:
return pobj
if pobj.readonly: if pobj.readonly:
return self._getDeviceParam(devobj, pname) return ParamReadonlyError(devname, pname)
writefunc = getattr(devobj, 'write_%s' % pname, None) writefunc = getattr(devobj, 'write_%s' % pname, None)
validator = pobj.validator try:
value = validator(value) if writefunc:
value = writefunc(value)
else:
setattr(devobj, pname, value)
except ValueError:
return InvalidParamValueError(devname, pname, value, e)
except Exception as e:
return InternalError(e)
if writefunc: return WriteParamReply(devname, pname, pobj.value, timestamp=pobj.timestamp)
value = writefunc(value) or value
else:
setattr(devobj, pname, value)
return self._getDeviceParam(devobj, pname) def _getParamValue(self, devname, pname):
devobj = self.get_device(devname)
if devobj is None:
return NoSuchDeviceError(devname)
pobj = devobj.PARAMS.get(pname, None)
if pobj is None:
return NoSuchParamError(devname, pname)
def _getDeviceParam(self, devobj, pname):
# get the device value
# if return == None -> Ellipsis
readfunc = getattr(devobj, 'read_%s' % pname, None) readfunc = getattr(devobj, 'read_%s' % pname, None)
if readfunc: if readfunc:
# should also update the pobj (via the setter from the metaclass) # should also update the pobj (via the setter from the metaclass)
readfunc() try:
pobj = devobj.PARAMS.get(pname, None) readfunc()
if pobj: except Exception as e:
return (pobj.value, pobj.timestamp) return InternalError(e)
return getattr(devobj, pname, Ellipsis) return ReadParamReply(devname, pname, pobj.value, timestamp=pobj.timestamp)
# demo stuff
def handle_Demo(self, conn, msg): def handle_Demo(self, conn, msg):
novalue = msg.novalue novalue = msg.novalue
devname = msg.devname devname = msg.devname
@ -344,7 +343,7 @@ class Dispatcher(object):
except TypeError as e: except TypeError as e:
return InternalError(e) return InternalError(e)
# now clean responce a little # now clean responce a little and sort value to top....
res = [ res = [
e.replace( e.replace(
'/v=', '/v=',
@ -361,106 +360,52 @@ class Dispatcher(object):
def handle_ListDevices(self, conn, msg): def handle_ListDevices(self, conn, msg):
# XXX: What about the descriptive data???? # XXX: What about the descriptive data????
# XXX: choose! # XXX: choose!
return ListDevicesReply(self.list_device_names()) # return ListDevicesReply(self.list_device_names())
# return ListDevicesReply(*self.list_devices()) return ListDevicesReply(*self.list_devices())
def handle_ListDeviceParams(self, conn, msg): def handle_ListDeviceParams(self, conn, msg):
# reply with a list of the parameter names for a given device # reply with a list of the parameter names for a given device
self.log.error('Keep: ListDeviceParams') devname = msg.device
if msg.device in self._dispatcher_export: if devname in self._dispatcher_export:
params = self.list_device_params(msg.device) params = self.list_device_params(devname).keys()
return ListDeviceParamsReply(msg.device, params.keys()) return ListDeviceParamsReply(devname, params)
else: else:
return NoSuchDeviceError(msg.device) return NoSuchDeviceError(device)
def handle_ReadAllDevices(self, conn, msg): def handle_ReadAllDevices(self, conn, msg):
# reply with a bunch of ReadValueReplies, reading ALL devices # reply with a bunch of ReadValueReplies, reading ALL devices
result = [] result = []
for devname in sorted(self.list_device_names()): for devname in sorted(self.list_device_names()):
devobj = self.get_device(devname) value = self._getParamValue(devname, 'value')
value = self._getdeviceValue(devobj) result.append(value)
if value is not Ellipsis:
result.append(ReadValueReply(devname, value,
timestamp=time.time()))
return ReadAllDevicesReply(readValueReplies=result) return ReadAllDevicesReply(readValueReplies=result)
def handle_ReadValue(self, conn, msg): def handle_ReadValue(self, conn, msg):
devname = msg.device devname = msg.device
devobj = self.get_device(devname) devobj = self.get_device(devname)
if devobj is None: res = self._getParamValue(devname, 'value')
return NoSuchDeviceError(devname) if not isinstance(res, ReadParamReply):
return res
value = self._getdeviceValue(devname) return WriteValueReply(devname, res.value, res.timestamp)
if value is not Ellipsis:
return ReadValueReply(devname, value,
timestamp=time.time())
return InternalError('undefined device value')
def handle_WriteValue(self, conn, msg): def handle_WriteValue(self, conn, msg):
value = msg.value value = msg.value
devname = msg.device devname = msg.device
devobj = self.get_device(devname) res = self._setParamValue(devname, 'target', value)
if devobj is None: if not isinstance(res, WriteParamReply):
return NoSuchDeviceError(devname) return res
return WriteValueReply(devname, res.value, res.timestamp)
pobj = getattr(devobj.PARAMS, 'target', None)
if pobj is None:
return NoSuchParamError(devname, 'target')
if pobj.readonly:
return ParamReadonlyError(devname, 'target')
validator = pobj.validator
try:
value = validator(value)
except Exception as e:
return InvalidParamValueError(devname, 'target', value, e)
value = self._setDeviceValue(devobj, value) or value
WriteValueReply(devname, value, timestamp=time.time())
def handle_ReadParam(self, conn, msg): def handle_ReadParam(self, conn, msg):
devname = msg.device devname = msg.device
pname = msg.param pname = msg.param
devobj = self.get_device(devname) return self._getParamValue(devname, pname)
if devobj is None:
return NoSuchDeviceError(devname)
pobj = getattr(devobj.PARAMS, pname, None)
if pobj is None:
return NoSuchParamError(devname, pname)
value = self._getdeviceParam(devobj, pname)
if value is not Ellipsis:
return ReadParamReply(devname, pname, value,
timestamp=time.time())
return InternalError('undefined device value')
def handle_WriteParam(self, conn, msg): def handle_WriteParam(self, conn, msg):
value = msg.value value = msg.value
pname = msg.param pname = msg.param
devname = msg.device devname = msg.device
devobj = self.get_device(devname) return self._setParamValue(devname, pname, value)
if devobj is None:
return NoSuchDeviceError(devname)
pobj = getattr(devobj.PARAMS, pname, None)
if pobj is None:
return NoSuchParamError(devname, pname)
if pobj.readonly:
return ParamReadonlyError(devname, pname)
validator = pobj.validator
try:
value = validator(value)
except Exception as e:
return InvalidParamValueError(devname, pname, value, e)
value = self._setDeviceParam(devobj, pname, value) or value
WriteParamReply(devname, pname, value, timestamp=time.time())
# XXX: !!! # XXX: !!!
def handle_RequestAsyncData(self, conn, msg): def handle_RequestAsyncData(self, conn, msg):

View File

@ -162,7 +162,7 @@ class vector(object):
if len(args) != len(self.validators): if len(args) != len(self.validators):
raise ValueError('Vector: need exactly %d elementes (got %d)' % raise ValueError('Vector: need exactly %d elementes (got %d)' %
len(self.validators), len(args)) len(self.validators), len(args))
return [v(e) for v, e in zip(self.validators, args)] return tuple(v(e) for v, e in zip(self.validators, args))
def __repr__(self): def __repr__(self):
return ('%s(%s)' % (self.__class__.__name__, self.argstr)) return ('%s(%s)' % (self.__class__.__name__, self.argstr))