Bunu böyle yapardım, bu yüzden türünü foo()değiştirmek de değiştirmeyi gerektirmez 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
Güncelleme 1
Orijinal geri izlemeyi koruyan küçük bir değişiklik:
...
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
Güncelleme 2
Python 3.x için, ilk güncellemede kod sözdizimi yanlış artı fikri olan messageüzerinde niteliğini BaseExceptionedildi PEP 352 bir değişiklik geri çekilir (benim ilk güncelleme 2012-03-12 tarihinde yayınlanmıştır) 2012-05-16 tarihinde . Yani, şu anda, Python 3.5.2'de, izlemeyi korumak ve işlevdeki istisna türünü sabit kodlamak için bu çizgiler boyunca bir şeyler yapmanız gerekir bar(). Ayrıca satır olacağını unutmayın:
During handling of the above exception, another exception occurred:
görüntülenen geri izleme mesajlarında.
# for Python 3.x
...
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')
Güncelleme 3
Cevap nedeniyle sözdizimi farklılıklara "Hayır" olarak gözükse de Python 2 ve 3'de hem de çalışacak bir yolu olsaydı bir yorumcu istedi, orada olduğu gibi bir yardımcı işlevi kullanarak o etrafında bir yolu reraise()içinde sixAdd-On'un modül üzerinde. Bu nedenle, kitaplığı herhangi bir nedenle kullanmak istemiyorsanız, aşağıda basitleştirilmiş bağımsız bir sürüm bulunmaktadır.
İstisna, işlev içinde yeniden düzenlendiği için reraise(), bu izin kaldırıldığı yerlerde görünecektir, ancak nihai sonuç istediğiniz şeydir.
import sys
if sys.version_info.major < 3: # Python 2?
# Using exec avoids a SyntaxError in Python 3.
exec("""def reraise(exc_type, exc_value, exc_traceback=None):
raise exc_type, exc_value, exc_traceback""")
else:
def reraise(exc_type, exc_value, exc_traceback=None):
if exc_value is None:
exc_value = exc_type()
if exc_value.__traceback__ is not exc_traceback:
raise exc_value.with_traceback(exc_traceback)
raise exc_value
def foo():
try:
raise IOError('Stuff')
except:
raise
def bar(arg1):
try:
foo()
except Exception as e:
reraise(type(e), type(e)(str(e) +
' happens at %s' % arg1), sys.exc_info()[2])
bar('arg1')
messageözniteliği için dokümantasyon ararken bu SO sorusunu buldum , Python 2.6'da kullanımdan vazgeçildiğini gösteren BaseException.message artık kullanılmıyor (ve neden dokümanlarda değil).