Je ferais comme cela, afin de changer son type en foo()
ne nécessitent aussi l'évolution en bar()
.
def foo():
try:
raise IOError('Stuff')
except:
raise
def bar(arg1):
try:
foo()
except Exception as e:
raise type(e)(e.message + ' happens at %s' % arg1)
bar('arg1')
Traceback (most recent call last):
File "test.py", line 13, in <module>
bar('arg1')
File "test.py", line 11, in bar
raise type(e)(e.message + ' happens at %s' % arg1)
IOError: Stuff happens at arg1
Mise à jour
Voici une légère modification qui conserve l'original de l'exī:
...
def bar(arg1):
try:
foo()
except Exception as e:
import sys
raise type(e), type(e)(e.message +
' happens at %s' % arg1), sys.exc_info()[2]
bar('arg1')
Traceback (most recent call last):
File "test.py", line 16, in <module>
bar('arg1')
File "test.py", line 11, in bar
foo()
File "test.py", line 5, in foo
raise IOError('Stuff')
IOError: Stuff happens at arg1
Mise à jour 2
Pour Python 3.x, le code dans ma première mise à jour est syntaxiquement incorrecte, plus l'idée d'avoir unmessage
attributBaseException
a été rétractée dans un changement de PEP 352 sur 2012-05-16 (la mise à jour a été posté sur 2012-03-12). Alors, actuellement en Python 3.4.0 de toute façon, vous auriez besoin de faire quelque chose le long de ces lignes de préserver la traçabilité en amont et de ne pas coder en dur le type d'exception dans la fonctionbar()
:
# for Python 3.0+
...
def bar(arg1):
try:
foo()
except Exception as e:
import sys
raise type(e)(str(e) +
' happens at %s' % arg1).with_traceback(sys.exc_info()[2])
bar('arg1')