exception-handling / exception modifizieren

24/09/2007 - 23:31 von r.koebler | Report spam
hi,

ich hab eine frage bzw. des handlings von exceptions: ich wuerde gerne
eine exception modifiziert weitergeben.

beispiel zur veranschaulichung:

def inner_func():
"""a function which may raise an exception"""
raise Exception("INNER")
#raise SyntaxError("INNER")

def test(lineno):
"""do something. if an exception is raised, propagate it
with an appended 'at line lineno'"""
try:
inner_func()
except Exception,err:
err.args = (err.args[0]+" at line %s" %(lineno),) +
err.args[1:]
raise




test(42)






Traceback (most recent call last):
...
Exception: INNER at line 42

(dieser code ist natuerlich nur zur veranschaulichung geeignet, und
funktioniert z.b. schon nicht mehr, wenn inner_func SyntaxError wirft,
oder wenn err.args leer ist.)

ich hoffe, damit ist klar, was ich meine: ich will einer exception
einfach
noch etwas zusatzinformation hinzufuegen.

da meiner meinung sowas haeufiger auftritt:
gibt es eine art "standard-loesung" fuer dieses problem?



die erste loesung, die mir dazu einfiele, waere folgende:

class myWrapperException(Exception):
def __init__(self, oldexc, lineno):
self.oldexc = oldexc
self.lineno = lineno
def __str__(self):
return "%s: %s at line %d" %(
self.oldexc.__class__.__name__, str(self.oldexc),
self.lineno)


def test2(lineno):
try:
inner_func()
except Exception,err:
raise myWrapperException(err,lineno)




test2(23)






Traceback (most recent call last):
...
__main__.myWrapperException: Exception: INNER at line 23


ist das ok, oder sollte man sowas anders machen?


schonmal danke,
Roland
 

Lesen sie die antworten

#1 Volker Grabsch
08/10/2007 - 02:46 | Warnen spam
r.koebler schrieb:
ich hoffe, damit ist klar, was ich meine: ich will einer exception
einfach noch etwas zusatzinformation hinzufuegen.

da meiner meinung sowas haeufiger auftritt:
gibt es eine art "standard-loesung" fuer dieses problem?



Das erscheint mir àußerst unsauber. Du willst wild irgendwelche
Attribute von Exceptions àndern, deren Klasse du gar nicht kennst.

Da ist es IMHO sinnvoller, nur diejenigen Exceptions "aufzuplustern",
die du auch kennst, und alle anderen Exceptions einfach weiter
zu reichen.

Traceback (most recent call last):
...
__main__.myWrapperException: Exception: INNER at line 23

ist das ok, oder sollte man sowas anders machen?



In deinem konkreten Beispiel: Ja! Du braust hier eine Standard-
funktionalitàt nach, den Stacktrace.

Du suchst wahrscheinlich: traceback.print_exc


Gruß,

Volker

Volker Grabsch
<<(())>>
Administrator
NotJustHosting GbR

Ähnliche fragen