handling unexpected exceptions in pdb
Simon Bierbaum
bierbaum at vierfalt.com
Thu Jul 10 17:12:36 EDT 2008
Am 10.07.2008 um 20:52 schrieb R. Bernstein:
> Simon Bierbaum <bierbaum at vierfalt.com> writes:
>
>> Hi all,
>>
>> I'm in an interactive session in pdb, debugging my code using
>> pdb.runcall. Somewhere, an exception is raised and lands uncaught on
>> stdout. Is there any way of picking up this exception and at least
>> read the full message, or even accessing its stack trace to determine
>> where exactly within the one line I just executed it was raised? This
>> is where I'm stuck:
>>
>>> /usr/local/apache2/bin/Model/Database.py(287)disconnect()
>> (Pdb) n
>> FlushError: FlushErr...perly.",)
>>> /usr/local/apache2/bin/Model/Database.py(287)disconnect()
>> (Pdb) import sys
>> (Pdb) sys.last_traceback
>> *** AttributeError: 'module' object has no attribute 'last_traceback'
>>
>> Thanks, Simon
>
> I think basically you want runcall to be wrapped in a try block. So
> in pdb.py
> instead of:
>
> def runcall(*args, **kwds):
> return Pdb().runcall(*args, **kwds)
>
>
> Change with:
>
> def runcall(*args, **kwds):
> p=Pdb()
> try:
> return p.runcall(*args, **kwds)
> except:
> traceback.print_exc()
> print "Uncaught exception. Entering post mortem debugging"
> t = sys.exc_info()[2]
> p.interaction(t.tb_frame,t)
> print "Post mortem debugger finished."
> return None
>
> Code like this appears near the bottom of the pdb.py file. If that
> works, you may want to file a bug Python report to change pdb. Also
> note that one may want to do the same thing on run() and runeval()
>
> But also if this does what you want, please file a feature request
> to pydb:
> http://sourceforge.net/tracker/?func=add&group_id=61395&atid=497162
>
> and I'll probably make it happen in the next release.
>
> This is the first time I've heard of anyone using runcall.
My app is called from mod_python with the PythonEnablePdb option set
to On, which makes mod_python call my handler function not directly,
but wrapped into a pdb.runcall(). I figure I might not be the first
one to use runcall under these circumstances ;-)
I'll definitely give your hack a try, thank you for your help!
Cheers, Simon
More information about the Python-list
mailing list