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