En Mon, 23 Feb 2009 15:54:03 -0200, <rdmur...@bitdance.com> escribió:
Stef Mientki <stef.mien...@gmail.com> wrote:

but I was looking for a more general solution,
in which I don't change the program itself,
and where the error messages (in general) become more informative than
it is by default.
No you are not the only one who wishes the error messages were
more informative.  In one complex application I had, I made my life
easier with a hack I copied from Zope.  Briefly, at the top level
of the program I trap all exceptions, get the traceback object from
sys.exc_info, format it with format_tb, and then process it to add info.
I applied several enhancements, but the one relevant to you was to grab
the locals dictionary from the last frame of the traceback, and use a
regex to split the last source line in the formatted traceback up into
candidate variable names.  Then I printed the name and the repr of the
value of any of those names I found in the locals dict.

Have you seen the cgitb module? Despite its name, it's a general purpose module.

<http://docs.python.org/library/cgitb.html>

<code>
import cgitb
cgitb.enable(format="txt")

def f(some_list, x, y):
  return some_list[x + y]

def g(a):
  return f(a, 1, 2) - f(a, 3, 4)

g([1,2,3,4])

</code>

Output:
<type 'exceptions.IndexError'>
Python 2.6: c:\apps\python26\python.exe
Mon Feb 23 22:06:22 2009

A problem occurred in a Python script. Here is the sequence of function calls leading up to the error, in the order they occurred.

 C:\TEMP\test_cgitb.py in <module>()
    8   return f(a, 1, 2) - f(a, 3, 4)
    9
   10 g([1,2,3,4])
   11
   12
g = <function g at 0x00B9FB70>

 C:\TEMP\test_cgitb.py in g(a=[1, 2, 3, 4])
    6
    7 def g(a):
    8   return f(a, 1, 2) - f(a, 3, 4)
    9
   10 g([1,2,3,4])
global f = <function f at 0x00B9FB30>
a = [1, 2, 3, 4]

 C:\TEMP\test_cgitb.py in f(some_list=[1, 2, 3, 4], x=3, y=4
)
    3
    4 def f(some_list, x, y):
    5   return some_list[x + y]
    6
    7 def g(a):
some_list = [1, 2, 3, 4]
x = 3
y = 4
<type 'exceptions.IndexError'>: list index out of range
    __class__ = <type 'exceptions.IndexError'>
    [..]
    args = ('list index out of range',)
    message = 'list index out of range'

The above is a description of an error in a Python program. Here is the original traceback:

Traceback (most recent call last):
  File "test_cgitb.py", line 10, in <module>
    g([1,2,3,4])
  File "test_cgitb.py", line 8, in g
    return f(a, 1, 2) - f(a, 3, 4)
  File "test_cgitb.py", line 5, in f
    return some_list[x + y]
IndexError: list index out of range


--
Gabriel Genellina

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

Reply via email to