AW: traceback as string
Bengt Richter
bokr at oz.net
Thu Dec 18 16:06:02 EST 2003
On Thu, 18 Dec 2003 11:44:46 +0100, "Oliver Walczak" <oliver.walczak at momatec.de> wrote:
>This seems to be a quite difficult approach. Try this:
[ snip nice code]
Here is a variant with repeat counting (may be a bit format-sensitive):
I rather wish something like it was built into the traceback print itself,
especially when recursing forever interactively, and one loses initial output context.
#####################################################################
import traceback
class MyTraceback:
def __init__(self):
self.clear()
def clear(self):
self.line = []
self.lines = []
self.repeat = 0
def write(self, s):
self.line.append(s)
if s[-1:] == '\n':
s = ''.join(self.line)
self.line = []
self.lines.append(s)
if len(self.lines)>=4 and self.lines[-4:-2] == self.lines[-2:]:
self.repeat += 1
del self.lines[-2:]
else:
if self.repeat and s!= self.lines[-3]:
if self.repeat==1:
self.lines.extend(self.lines[-2:])
else:
self.lines.insert(-1,
' *** previous two lines repeated %s times ***\n\n'% self.repeat)
self.repeat = 0
def read(self):
return ''.join(self.lines + self.line)
def catch(self):
traceback.print_exc(None, self)
if __name__ == '__main__':
myTcb = MyTraceback()
def foo(n):
if n<0: foo(n) # blow stack
print '---> foo(%s)'%n
if n>0: foo(n-1)
1/0
try:
foo(5)
except:
myTcb.clear()
myTcb.catch()
print myTcb.read()
try:
foo(-5)
except:
myTcb.clear()
myTcb.catch()
print myTcb.read()
######################################################################
Result:
[13:19] C:\pywk\clp>mytracebk.py
---> foo(5)
---> foo(4)
---> foo(3)
---> foo(2)
---> foo(1)
---> foo(0)
Traceback (most recent call last):
File "C:\pywk\clp\mytracebk.py", line 41, in ?
foo(5)
File "C:\pywk\clp\mytracebk.py", line 38, in foo
if n>0: foo(n-1)
*** previous two lines repeated 4 times ***
File "C:\pywk\clp\mytracebk.py", line 39, in foo
1/0
ZeroDivisionError: integer division or modulo by zero
Traceback (most recent call last):
File "C:\pywk\clp\mytracebk.py", line 47, in ?
foo(-5)
File "C:\pywk\clp\mytracebk.py", line 36, in foo
if n<0: foo(n) # blow stack
*** previous two lines repeated 998 times ***
RuntimeError: maximum recursion depth exceeded
Regards,
Bengt Richter
More information about the Python-list
mailing list