improve more errors during startup

errors from a module a combined with a header and intended
details

Change-Id: I4be7bc2f8455fb0e3c9346f3bb23ac88e7589604
This commit is contained in:
zolliker 2021-04-27 15:56:19 +02:00
parent 4a0796a1bd
commit 06551b17e2
2 changed files with 28 additions and 27 deletions

View File

@ -257,8 +257,8 @@ class Module(HasAccessibles):
try: try:
self.setProperty(key, value) self.setProperty(key, value)
except BadValueError: except BadValueError:
errors.append('module %s, %s: value %r does not match %r!' % errors.append('%s: value %r does not match %r!' %
(name, key, value, self.propertyDict[key].datatype)) (key, value, self.propertyDict[key].datatype))
# 3) set automatic properties # 3) set automatic properties
mycls = self.__class__ mycls = self.__class__
@ -317,21 +317,21 @@ class Module(HasAccessibles):
try: try:
paramobj.setProperty(propname, propvalue) paramobj.setProperty(propname, propvalue)
except KeyError: except KeyError:
errors.append('module %s: %s.%s does not exist' % errors.append("'%s.%s' does not exist" %
(self.name, paramname, propname)) (paramname, propname))
except BadValueError as e: except BadValueError as e:
errors.append('module %s: %s.%s: %s' % errors.append('%s.%s: %s' %
(self.name, paramname, propname, str(e))) (paramname, propname, str(e)))
else: else:
errors.append('module %s: %s not found' % (self.name, paramname)) errors.append('%r not found' % paramname)
# 3) check config for problems: # 3) check config for problems:
# only accept remaining config items specified in parameters # only accept remaining config items specified in parameters
bad = [k for k in cfgdict if k not in self.parameters] bad = [k for k in cfgdict if k not in self.parameters]
if bad: if bad:
errors.append( errors.append(
'module %s: %s does not exist (use one of %s)' % '%s does not exist (use one of %s)' %
(self.name, ', '.join(bad), ', '.join(list(self.parameters) + (', '.join(bad), ', '.join(list(self.parameters) +
list(self.propertyDict)))) list(self.propertyDict))))
# 4) complain if a Parameter entry has no default value and # 4) complain if a Parameter entry has no default value and
@ -349,13 +349,12 @@ class Module(HasAccessibles):
pobj.value = pobj.datatype(cfgdict[pname]) pobj.value = pobj.datatype(cfgdict[pname])
self.writeDict[pname] = pobj.value self.writeDict[pname] = pobj.value
except BadValueError as e: except BadValueError as e:
errors.append('module %s, parameter %s: %s' % (name, pname, e)) errors.append('%s: %s' % (pname, e))
else: else:
if pobj.default is None: if pobj.default is None:
if pobj.needscfg: if pobj.needscfg:
errors.append('module %s, parameter %s has no default ' errors.append('%r has no default '
'value and was not given in config!' % 'value and was not given in config!' % pname)
(self.name, pname))
# we do not want to call the setter for this parameter for now, # we do not want to call the setter for this parameter for now,
# this should happen on the first read # this should happen on the first read
pobj.readerror = ConfigError('not initialized') pobj.readerror = ConfigError('not initialized')
@ -383,7 +382,7 @@ class Module(HasAccessibles):
try: try:
# this checks also for the proper datatype # this checks also for the proper datatype
# note: this will NOT call write_* methods! # note: this will NOT call write_* methods!
if hasattr(self, k): if k in self.parameters or k in self.propertyDict:
setattr(self, k, v) setattr(self, k, v)
cfgdict.pop(k) cfgdict.pop(k)
except (ValueError, TypeError): except (ValueError, TypeError):
@ -401,14 +400,14 @@ class Module(HasAccessibles):
try: try:
self.checkProperties() self.checkProperties()
except ConfigError as e: except ConfigError as e:
errors.append('module %s: %s' % (name, e)) errors.append(str(e))
for pname, p in self.parameters.items(): for pname, p in self.parameters.items():
try: try:
p.checkProperties() p.checkProperties()
except ConfigError: except ConfigError:
errors.append('module %s, parameter %s: %s' % (name, pname, e)) errors.append('%s: %s' % (pname, e))
if errors: if errors:
raise ConfigError('\n'.join(errors)) raise ConfigError(errors)
# helper cfg-editor # helper cfg-editor
def __iter__(self): def __iter__(self):
@ -522,10 +521,12 @@ class Module(HasAccessibles):
with proper error handling with proper error handling
""" """
for pname in list(self.writeDict): for pname in list(self.writeDict):
if pname in self.writeDict: # this might not be true with handlers value = self.writeDict.pop(pname, Done)
# in the mean time, a poller or handler might already have done it
if value is not Done:
try: try:
self.log.debug('initialize parameter %s', pname) self.log.debug('initialize parameter %s', pname)
getattr(self, 'write_' + pname)(self.writeDict.pop(pname)) getattr(self, 'write_' + pname)(value)
except SilentError: except SilentError:
pass pass
except SECoPError as e: except SECoPError as e:

View File

@ -245,12 +245,8 @@ class Server:
continue continue
cls = get_class(classname) cls = get_class(classname)
except Exception as e: except Exception as e:
if pymodule is None: if str(e) == 'no such class':
if str(e) == 'no such class': errors.append('%s not found' % classname)
errors.append('%s not found' % classname)
else:
raise
errors.append(repr(e))
else: else:
failed.add(pymodule) failed.add(pymodule)
failure_traceback = traceback.format_exc() failure_traceback = traceback.format_exc()
@ -262,9 +258,13 @@ class Server:
if opts: if opts:
errors.append(self.unknown_options(cls, opts)) errors.append(self.unknown_options(cls, opts))
self.modules[modname] = modobj self.modules[modname] = modobj
except Exception as e: except ConfigError as e:
errors.append('error creating module %s:' % modname)
for errtxt in e.args[0]:
errors.append(' ' + errtxt)
except Exception:
failure_traceback = traceback.format_exc() failure_traceback = traceback.format_exc()
errors.append('error creating %s: %r' % (modname, e)) errors.append('error creating %s' % modname)
poll_table = dict() poll_table = dict()
# all objs created, now start them up and interconnect # all objs created, now start them up and interconnect