| 1 | ||
|
Editor: pepr
Time: 2005/08/01 08:43:22 GMT+0 |
||
| Note: Upraveno formátování, pepr | ||
changed: - 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
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