factorization of CallErrors exception handlers

This commit is contained in:
Romain Bignon 2010-11-11 01:43:58 +01:00
commit 3fb2bb6575
4 changed files with 78 additions and 48 deletions

View file

@ -17,7 +17,6 @@
import sys import sys
import logging
import weboob import weboob
from weboob.tools.application.repl import ReplApplication from weboob.tools.application.repl import ReplApplication
@ -86,7 +85,10 @@ class HaveSex(ReplApplication):
def main(self, argv): def main(self, argv):
self.load_config() self.load_config()
try:
self.do('init_optimizations').wait() self.do('init_optimizations').wait()
except weboob.core.CallErrors, e:
self.bcall_errors_handler(e)
optimizations = self.storage.get('optims') optimizations = self.storage.get('optims')
for optim, backends in optimizations.iteritems(): for optim, backends in optimizations.iteritems():
@ -116,6 +118,10 @@ class HaveSex(ReplApplication):
return True return True
def edit_optims(self, backend_names, optims_names, stop=False): def edit_optims(self, backend_names, optims_names, stop=False):
if optims_names is None:
print >>sys.stderr, 'Error: missing parameters.'
return 1
for optim_name in optims_names.split(): for optim_name in optims_names.split():
backends_optims = {} backends_optims = {}
for backend, optim in self.do('get_optimization', optim_name, backends=backend_names): for backend, optim in self.do('get_optimization', optim_name, backends=backend_names):
@ -181,9 +187,7 @@ class HaveSex(ReplApplication):
if isinstance(error, OptimizationNotFound): if isinstance(error, OptimizationNotFound):
self.logger.error(u'Error(%s): Optimization "%s" not found' % (backend.name, optim_name)) self.logger.error(u'Error(%s): Optimization "%s" not found' % (backend.name, optim_name))
else: else:
self.logger.error(u'Error(%s): %s' % (backend.name, error)) self.bcall_error_handler(backend, error, backtrace)
if logging.root.level == logging.DEBUG:
self.logger.error(backtrace)
if store: if store:
if len(storage_optim) > 0: if len(storage_optim) > 0:
self.storage.set('optims', optim_name, list(storage_optim)) self.storage.set('optims', optim_name, list(storage_optim))

View file

@ -221,12 +221,7 @@ class Monboob(ReplApplication):
if self.send_email(backend, message): if self.send_email(backend, message):
backend.set_message_read(message) backend.set_message_read(message)
except CallErrors, e: except CallErrors, e:
for backend, error, backtrace in e.errors: self.bcall_errors_handler(e)
print >>sys.stderr, u'Error(%s): %s' % (backend.name, error)
if logging.root.level == logging.DEBUG:
print >>sys.stderr, backtrace
if logging.root.level != logging.DEBUG:
print >>sys.stderr, 'Use --debug option to print backtraces.'
def send_email(self, backend, mail): def send_email(self, backend, mail):
domain = self.config.get('domain') domain = self.config.get('domain')

View file

@ -255,6 +255,25 @@ class BaseApplication(object):
else: else:
return self._do_complete_obj(backend, selected_fields, res) return self._do_complete_obj(backend, selected_fields, res)
def bcall_error_handler(self, backend, error, backtrace):
"""
Handler for an exception inside the CallErrors exception.
This method can be overrided to support more exceptions types.
"""
print >>sys.stderr, u'Error(%s): %s' % (backend.name, error)
if logging.root.level == logging.DEBUG:
print >>sys.stderr, backtrace
def bcall_errors_handler(self, errors):
"""
Handler for the CallErrors exception.
"""
for backend, error, backtrace in errors.errors:
self.bcall_error_handler(backend, error, backtrace)
if logging.root.level != logging.DEBUG:
print >>sys.stderr, 'Use --debug option to print backtraces.'
def parse_args(self, args): def parse_args(self, args):
self.options, args = self._parser.parse_args(args) self.options, args = self._parser.parse_args(args)
@ -351,11 +370,7 @@ class BaseApplication(object):
print 'Configuration error: %s' % e print 'Configuration error: %s' % e
sys.exit(1) sys.exit(1)
except CallErrors, e: except CallErrors, e:
for backend, error, backtrace in e.errors: app.bcall_errors_handler(e)
print >>sys.stderr, u'Error(%s): %s' % (backend.name, error) sys.exit(1)
if logging.root.level == logging.DEBUG:
print >>sys.stderr, backtrace
if logging.root.level != logging.DEBUG:
print >>sys.stderr, 'Use --debug option to print backtraces.'
finally: finally:
app.deinit() app.deinit()

View file

@ -351,24 +351,12 @@ class ReplApplication(Cmd, BaseApplication):
stop = None stop = None
return stop return stop
def onecmd(self, line): def bcall_error_handler(self, backend, error, backtrace):
""" """
This REPL method is overrided to catch some particular exceptions. Handler for an exception inside the CallErrors exception.
This method can be overrided to support more exceptions types.
""" """
cmd, arg, ignored = self.parseline(line)
# Set the right formatter for the command.
try:
formatter_name = self.commands_formatters[cmd]
except KeyError:
formatter_name = self.DEFAULT_FORMATTER
self.set_formatter(formatter_name)
try:
return super(ReplApplication, self).onecmd(line)
except CallErrors, e:
ask_debug_mode = False
for backend, error, backtrace in e.errors:
if isinstance(error, BrowserIncorrectPassword): if isinstance(error, BrowserIncorrectPassword):
msg = unicode(error) msg = unicode(error)
if not msg: if not msg:
@ -392,12 +380,40 @@ class ReplApplication(Cmd, BaseApplication):
if logging.root.level == logging.DEBUG: if logging.root.level == logging.DEBUG:
print >>sys.stderr, backtrace print >>sys.stderr, backtrace
else: else:
return True
def bcall_errors_handler(self, errors):
"""
Handler for the CallErrors exception.
"""
ask_debug_mode = False
for backend, error, backtrace in errors.errors:
if self.bcall_error_handler(backend, error, backtrace):
ask_debug_mode = True ask_debug_mode = True
if ask_debug_mode: if ask_debug_mode:
if self.interactive: if self.interactive:
print >>sys.stderr, 'Use "logging debug" option to print backtraces.' print >>sys.stderr, 'Use "logging debug" option to print backtraces.'
else: else:
print >>sys.stderr, 'Use --debug option to print backtraces.' print >>sys.stderr, 'Use --debug option to print backtraces.'
def onecmd(self, line):
"""
This REPL method is overrided to catch some particular exceptions.
"""
cmd, arg, ignored = self.parseline(line)
# Set the right formatter for the command.
try:
formatter_name = self.commands_formatters[cmd]
except KeyError:
formatter_name = self.DEFAULT_FORMATTER
self.set_formatter(formatter_name)
try:
return super(ReplApplication, self).onecmd(line)
except CallErrors, e:
self.bcall_error_handler(e)
except NotEnoughArguments, e: except NotEnoughArguments, e:
print >>sys.stderr, 'Error: no enough arguments.' print >>sys.stderr, 'Error: no enough arguments.'
except (KeyboardInterrupt,EOFError): except (KeyboardInterrupt,EOFError):