Create a new (subclass of) Handler object for an action with the
given type. conf is the configuration to pass to the handler.
- If the handler cannot be loaded, it is logged and None is returned
- (but any exceptions raised by the handler code itself are not
- handled).
+ If the handler cannot be loaded, an exception is thrown.
"""
modname = 'backupninja.handlers.%s' % ty
# Load the handler if it is not loaded yet
try:
__import__(modname, globals(), locals(), [])
except ImportError, e:
- log.error('Cannot load action handler for "%s": %s'
- , ty, e)
- return None
+ # Add some extra info, since the default exception does not
+ # show the full module name.
+ raise ImportError('Cannot load module %s: %s' % (modname, e))
# Get the module from the module table
module = sys.modules[modname]
# Check that the module has a "handler" top level function, which
# should create a new Handler object.
if not hasattr(module, 'handler'):
- log.error('Action handler for "%s" (in "%s) is not valid: it '
- 'does not have a "handler" top level function.'
- , ty, module.__file__)
- return None
+ raise ImportError('%s is not valid: it '
+ 'does not have a "handler" top level function.'
+ % (module.__file__))
# Call the "handler" function to create the actual handler
handler = module.handler(conf)
# Check if the handler returned is really a subclass of Handler
if not isinstance(handler, Handler):
- log.error('Action handler for "%s" (in "%s) is not valid: it '
- 'does not return a subclass of backupninja.handlers.Handler.'
- , ty, module.__file__)
- return None
+ raise TypeError('%s is not valid, %s.handler did not return a '
+ 'subclass of backupninja.handlers.Handler.'
+ % (module.__file__, modname))
return handler