V jednom z programů jsem potřeboval logovat chyby do databáze, nejvíc se mi líbil klasický pythonní výpis chyby:
Traceback (most recent call last):
File "Z:\python\errory\pok_01.py", line 40, in ?
pepa()
File "Z:\python\errory\pok_01.py", line 17, in pepa
print "a"+1
TypeError: cannot concatenate 'str' and 'int' objects
Tady ale nastal problém s tím, jak tento výpis uložit do proměnné, aby mohl být předán k uložení. Přes několik pokusů s přesměrováním sys.stderr:
import sys
soubor=file('chyby.txt','w')
sys.stderr=soubor
sys.stdout=soubor
try:
print "6"+4 # chyba
except Exception,x:
print Exception,'\n', x
soubor.close()
sys.stdout=sys.__stdout__
sys.stderr=sys.__stderr__
nebo:
class TeeStream:
def __init__(self, *outstreams):
self.outstreams=outstreams
def write(self, text):
for outstream in self.outstreams:
outstream.write(text)
import sys
mylogfile = open('stream_mylogfile.txt','w')
sys.stdout = TeeStream (mylogfile, sys.stdout)
sys.stderr = TeeStream (mylogfile, sys.stderr)
print 4*55
print wedsfsdf
mylogfile.close()
jsem se nakonec po 'nakopnutí' od geona dostal k modulu traceback a napsal funkci get_exception():
import sys,traceback
def get_exception():
exc=sys.exc_info()
sys.exc_clear()
ex_type=exc[0]
ex_fault=exc[1]
ex_trace_all=traceback.extract_tb(exc[2])
ex_str='Traceback (most recent call last):\n'
for ex_trace in ex_trace_all:
ex_str+=' File "'+ex_trace[0]+'", line '+str(ex_trace[1])+', in '+ex_trace[2]+'\n'
ex_str+=' '+ex_trace[3]+'\n'
ex_str+=str(ex_type)+': '+str(ex_fault)
return ex_str
def pepa():
print "a"+1
try:
print "6"+4 # chyba
except:
variable=get_exception()
print variable
Výstup z programu vypadá takto:
Traceback (most recent call last):
File "Z:\python\errory\pok_01.py", line 20, in ?
print "6"+4 # chyba
exceptions.TypeError: cannot concatenate 'str' and 'int' objects
Tady je další geonových nakopnutí, nyní směrem k modulu StringIO:
import traceback, StringIO
def get_exception():
vyjimka=StringIO.StringIO() # vytvorime file-like objekt
vyjimka.write("Exception in user code:\n")
traceback.print_exc(file=vyjimka) # kvuli teto funkci jsme to vse delali
vyjimka.write('-'*60)
chyba=vyjimka.getvalue() # zapis hodnoty do promenne, abychom ....
vyjimka.close() # ...mohli uvolnit pamet
return chyba