[Tutor PyCZ] handlovani erroru

geon geon na post.cz
Pátek Červenec 22 18:41:19 CEST 2005


rajcze wrote:

>tak sem to nakonec vymyslel :)
>diky za nakopnuti smerem k modulu traceback - to bylo presne to co sem
>potreboval
>zkusim to teda dat na wiki, jak si rikal
>diky za pomoc
>     josef skladanka
>
>
>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
>
>try:
>   print "6"+4  # chyba
>except:
>    variable=get_exception()
>    print variable
>  
>
>------------------------------------------------------------------------
>

Cestou do krámu jsem na to myslel a říkal jsem si, jestli by to nešlo 
nějak jednodušeji......Pořád jsem myslel taky na ten příklad u traceback 
v nápovědě. A pak mi to došlo! Python umí, místo file používat file-like 
objekt. Prostě objekt, který se jen jako file tváří, ve stkutečnoti však 
vše ukládá do RAM.

Už jsem vlastně psal, že to může být jakákoliv třída, která má min. 
metodu write, i jsem posílal příklad. Python má jednu takovou již 
zabudovanou a ten modul se jmenuje StringIO. Použití je jako u souboru:

import StringIO

skoroSoubor=StringIO.StringIO()
skoroSoubor.write('ahoj\n')
skoroSoubor.write('jak se mas?')
print skoroSoubor.tell()
dopis=skoroSoubor.getvalue()
print dopis

Má všechny metody jako file a ještě navíc getvalue(). A to se nám přesně 
hodí. Takže potom se  za použití vysokourovnove funkce 
traceback.print_exc() zjednodušuje funkce na toto (v duchu ukázky z 
nápovědy k traceback):

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)
    x=vyjimka.getvalue()   # zapis hodnoty do x, abychom ....
    vyjimka.close()       # ...mohli uvolnit pamet

    return x

try:
   print "6"+4  # chyba
except:
    variable=get_exception()
    print variable

Měj se!

P.S. Stejně si myslím, že to jde ještě jednodušeji .....;-)

-- 
geon
Vyjímka je pravidlo. Rekurzivní.

------------- další část ---------------
HTML příloha byla odstraněna...
URL: http://www.py.cz/pipermail/tutor/attachments/20050722/b82daf06/attachment.htm


Další informace o konferenci Tutor