sys.stderr and PyErr_WriteUnraisable

Jan Langer jan.langer at etit.tu-chemnitz.de
Tue Dec 15 11:44:23 EST 2009


Jan Langer schrieb:
> Gabriel Genellina schrieb:
>> En Tue, 15 Dec 2009 11:17:20 -0300, Jan Langer 
>> <jan.langer at etit.tu-chemnitz.de> escribió:
>>
>>> from test.test_support import captured_output
>>> with captured_output("stderr") as stderr:
>>>      def g():
>>>          try:
>>>              g()
>>>          except RuntimeError,e:
>>>              pass
>>>      g()
>>>      print stderr.getvalue()
>>>
>>> I expect the ignored exceptions to be printed into the StringIO 
>>> object stderr. With this code there are no warnings on the command 
>>> line, but getvalue() returns nothing.
>>
>> If sys.stderr is not a real file, no error gets printed.
>> PyErr_WriteUnraisable calls PyFile_WriteString, which checks for 
>> non-file objects and only writes to them when no error is set.
>> Seems to be a safety measure.
>>
> 
> thanks for the quick answer. PyErr_WriteUnraisable calls PyErr_Fetch 
> first, which should clear the error indicator, and the PyErr_Occurred in 
> PyFile_WriteString should return false.

When thinking about it, it might be possible that the writing to the 
StringIO object will hit the recursion limit, too. But then I would 
expect a inifinte loops of

1 write to stderr
2 raise recursion exception
3 detect the error
4 call writeunraisable
5 write to stderr
6 loop to 2

But I have no overview happens exactly. :-)



More information about the Python-list mailing list