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 BaseException
edildi 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 six
Add-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).