En Thu, 11 Dec 2008 07:49:42 -0200, R. Bernstein <ro...@panix.com> escribió:
brooklineTom <brookline...@gmail.com> writes:

I want my exception handler to report the method that originally
raised an exception, at the deepest level in the call-tree. Let give
an example.

extract_stack() without any arguments is getting this from the
*current frame* which as you noted doesn't have the last exception
info included which has been popped; variable sys.last_traceback has the frames
at the time of the exception, I think.

So in your code try changing:
             aRawStack = traceback.extract_stack()
to
             aRawStack = traceback.extract_stack(sys.last_traceback)

No, last_traceback is the last *printed* traceback in the interactive interpreter. Use the third element in sys.exc_info() instead:

import sys, traceback

class SomeClass:
  def error(self):
    """Raises an AttributeError exception."""
    int(3).zork()

  def perform_(self, aSelector):
    try:
      aMethod = getattr(self, aSelector)
      answer = aMethod()
    except AttributeError:
      tb = sys.exc_info()[2]
      try:
        print "Using traceback.print_tb:"
        traceback.print_tb(tb)
        print "Using traceback.print_exception:"
        traceback.print_exception(*sys.exc_info())
        print "Using traceback.extract_tb:"
        print traceback.extract_tb(tb)
      finally:
        del tb

SomeClass().perform_("error")

output:

Using traceback.print_tb:
  File "test_tb.py", line 11, in perform_
    answer = aMethod()
  File "test_tb.py", line 6, in error
    int(3).zork()
Using traceback.print_exception:
Traceback (most recent call last):
  File "test_tb.py", line 11, in perform_
    answer = aMethod()
  File "test_tb.py", line 6, in error
    int(3).zork()
AttributeError: 'int' object has no attribute 'zork'
Using traceback.extract_tb:
[('test_tb.py', 11, 'perform_', 'answer = aMethod()'), ('test_tb.py', 6, 'error'
, 'int(3).zork()')]

(The "3-name form of the except clause" that I menctioned previously only exists in my imagination :) )

--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to