logging exceptions

Rob Wolfe rw at smsnet.pl
Wed Aug 27 05:30:09 EDT 2008



Vinay Sajip napisał(a):
> On Aug 26, 10:36 am, Alexandru  Mosoi <brtz... at gmail.com> wrote:
> > why doesn'tloggingthrow any exception when it should? how do I
> > configureloggingto throw exceptions?
> >
> > >>> try:
> >
> > ...  logging.fatal('asdf %d', '123')
> > ... except:
> > ...   print 'this line is never printed'
> > ...
> > Traceback (most recent call last):
> >   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> > python2.5/logging/__init__.py", line 744, in emit
> >     msg = self.format(record)
> >   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> > python2.5/logging/__init__.py", line 630, in format
> >     return fmt.format(record)
> >   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> > python2.5/logging/__init__.py", line 418, in format
> >     record.message = record.getMessage()
> >   File "/Library/Frameworks/Python.framework/Versions/2.5/lib/
> > python2.5/logging/__init__.py", line 288, in getMessage
> >     msg = msg % self.args
> > TypeError: int argument required
>
> Was your traceback from the snippet you posted? If it was, then the
> exception (a TypeError) *is* being raised from logging. So I don't
> understand your question "why doesn't logging throw any exception when
> it should?", because logging is raising an exception here.

No, it isn't.
This traceback is *printed* in `Handler.handleError` method:

<code from logging>
__version__ = "0.5.0.2"

[...]

    def handleError(self, record):
        """
        Handle errors which occur during an emit() call.

        This method should be called from handlers when an exception
is
        encountered during an emit() call. If raiseExceptions is
false,
        exceptions get silently ignored. This is what is mostly wanted
        for a logging system - most users will not care about errors
in
        the logging system, they are more interested in application
errors.
        You could, however, replace this with a custom handler if you
wish.
        The record which was being processed is passed in to this
method.
        """
        if raiseExceptions:
            ei = sys.exc_info()
            traceback.print_exception(ei[0], ei[1], ei[2], None,
sys.stderr)
            del ei

</code from logging>

>
> To cause logging to *not* raise exceptions, set
> logging.raiseExceptions to 0 (default is 1). The raiseExceptions
> variable would normally be set to 0 in a production environment, where
> you don't want logging-related exceptions to bring an application
> down.

Well, I think that it will not help. The exception will be printed
not raised. The only solution is to redefine `handleError` method
or maybe I've missed something?

Br,
Rob



More information about the Python-list mailing list