From: Kent J. <ke...@td...> - 2004-01-13 23:29:19
|
I am trying to capture exception traces to a log file, when the exception is generated in a java Thread other than the startup thread. I have not been able to get this to work. Assignment to sys.stdout and sys.stderr seem to work fine in a second thread, it is specifically the exception output that is not redirected. Here is a test program: ##################### ''' Demonstrate problem with redirecting sys.excepthook in a java Thread ''' import sys, traceback class Redirect: def write(self, msg): sys.__stdout__.write('*** ' + msg) def myExceptHook(typ, value, tb): lines = traceback.format_exception(typ, value, tb) for line in lines: sys.__stdout__.write('*** ' + line) if __name__ == '__main__': import java redirector = Redirect() sys.stdout = sys.stderr = redirector sys.excepthook = myExceptHook print 'testing from main' sys.stderr.write('This is an error\n') 1/0 # An exception here shows up with stars class TestException(java.lang.Thread): def run(self): print 'Message from TestException' sys.stderr.write('Error from TestException\n') # This exception is printed by the standard excepthook 1/0 TestException().start() ##################### The output of this version of the program is: *** testing from main*** *** This is an error *** Traceback (most recent call last): *** File "D:\Projects\Meccano\(misc)\RedirectTest.py", line 25, in ? 1/0 # An exception here shows up with stars *** ZeroDivisionError: integer division or modulo This shows that stdout, stderr and exception traces are all redirected from the main thread. (The output is similar if sys.excepthook is not set.) If the line containing '1/0' is commented out so that the TestException thread runs, the output is: *** testing from main*** *** This is an error *** Message from TestException*** *** Error from TestException Traceback (innermost last): File "D:\Projects\Meccano\(misc)\RedirectTest.py", line 33, in run ZeroDivisionError: integer division or modulo You can see that stdout and stderr from the thread are redirected but the exception output is not. How can I get the exception output from the TextException thread to go to either the redirected stderr or the custom excepthook? Thanks, Kent |