Capturing errors raised by other scripts ?

Lie Ryan lie.1296 at gmail.com
Sat Feb 20 03:04:22 EST 2010


On 02/20/10 14:39, northof40 wrote:
> On Feb 20, 4:13 pm, MRAB <pyt... at mrabarnett.plus.com> wrote:
>> northof40 wrote:
>>> I'm using the subroutine module to run run python script A.py from
>>> B.py (this is on windows fwiw).
>>
>>> A.py is not my script and it may raise arbitary errors before exiting.
>>> How can I determine what's happened before A.py exited ?
>>
>>> To simulate this I've got this script (which is meant to simulate
>>> A.py):
>>
>>> class customError(Exception):
>>>    def __init__(self, value):
>>>            self.value = value
>>>    def __str__(self):
>>>            return repr(self.value)
>>
>>> try:
>>>    raise customError(2*2)
>>> except customError as e:
>>>    print 'Custom exception occurred, value:', e.value
>>
>>> I then run my A.py like this :
>>
>>>>>> fdOut, fOut = tempfile.mkstemp(suffix='.txt', prefix='AOut-')
>>>>>> fdErr, fErr = tempfile.mkstemp(suffix='.txt', prefix='AErr-')
>>>>>> try:
>>> ...     pathtojob="python.exe A.py"
>>> ...     p = subprocess.Popen(pathtojob, stderr=fdErr, stdout=fdOut)
>>> ... except:
>>> ...     print "bad stuff happened"
>>> ...
>>
>>> When I do this I the exception handler is not fired and the text
>>> "Custom exception occurred, value: 4" ends up in the stdout file.



>>> I'd really like it to end up in stderr because then I could say
>>> "anything in stderr ? then ignore the output and flag an error".

Not really; not all that is written to stderr signifies errors per se.
Warning and Debugging info are often written to stderr as well.

> Thanks for your reply. I take your point about print - perhaps I
> hadn't really thought that through. Unfortunately I don't have control
> of the real script that's being run so if the programmer of that
> script has used print there's nothing I can do about it.

Tracebacks is almost always written to stderr, not stdout; unless the
programmer explicitly redirect the traceback into stdout.

> Perhaps I could modify the question. If A.py terminates due an
> unhandled exception is there anyway for B.py to know that's happened
> (without A.py's cooperation ?).

A well-behaved program will exit with status code 0; if and only if it
exited cleanly. I believe a python program that exited due to unhandled
exception always return non-zero status code.

However, if the program handled an error and called exit(0) explicitly
or the execution of the program falls to the end of the module; there is
no way to distinguish it from regular clean exit.



More information about the Python-list mailing list