Vinay Sajip added the comment:

I've looked into it further, and IMO this is not a bug. The rationale is this: 
when an exception is raised during logging, it is passed to a
handleError method, see

http://hg.python.org/cpython/file/67ada6ab7fe2/Lib/logging/__init__.py#l786

This swallows the exception if logging.raiseExceptions is false or if there is 
no sys.stderr, otherwise it just writes the original traceback to sys.stderr 
and ignores any I/O errors which result during that write.

ISTM RDM's analysis is not quite right: logging doesn't try to re-print the 
arguments. The key indicator is the line

Logged from file <stdin>, line 1

which appears in the traceback shown, indicating that there is no exception in 
the handleError method itself.

The suggestion by the.mulhern is also based on an incorrect assumption: logging 
applies the formatting lazily (i.e. late, rather than early), so it would be 
premature to do anything in LogRecord.__init__. The exception-causing code is 
called after determining that the record must be processed, and a formatter is 
asked to format it. This is by design. Note that logging doesn't crash: if the 
script

class Junk:
    def __repr__(self):
        raise AttributeError('junk')

import logging; logging.warning('%r', Junk())
print('Done.')

is run, it prints

Traceback (most recent call last):
  File "/home/vinay/projects/python/2.7/Lib/logging/__init__.py", line 851, in 
emit
    msg = self.format(record)
  File "/home/vinay/projects/python/2.7/Lib/logging/__init__.py", line 724, in 
format
    return fmt.format(record)
  File "/home/vinay/projects/python/2.7/Lib/logging/__init__.py", line 464, in 
format
    record.message = record.getMessage()
  File "/home/vinay/projects/python/2.7/Lib/logging/__init__.py", line 328, in 
getMessage
    msg = msg % self.args
  File "logtest3.py", line 3, in __repr__
    raise AttributeError('junk')
AttributeError: junk
Logged from file logtest3.py, line 5
Done.

That last "Done." shows that logging keeps going: while it prints the exception 
traceback to sys.stderr (so it looks like it's failing) it is not actually 
failing, and the code after the logging call continues normally even if there 
is a formatting failure (or other exception during emission of a logging 
message).

Closing as invalid, unless you come up with something else :-)

----------
assignee:  -> vinay.sajip
resolution:  -> invalid
status: open -> closed

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue20918>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to