2012-01-25 14 views
9

Python'da yaygın bir model, bir giriş modülünde bir hatayı yakalamak ve bu hatayı daha yararlı bir şey olarak yeniden yükseltmektir.Python'da iç içe geçmiş veya yeniden yükseltilmiş istisnalara erişmenin bir yolu var mı?

try: 
    config_file = open('config.ini', 'r') 
except IOError: 
    raise ConfigError('Give me my config, user!') 

Bu formda

Traceback (most recent call last): 
    File "<stdin>", line 4, in <module> 
__main__.ConfigError: Give me my config, user! 

bu gibi daha fazla bir yığın izleme üretmek için sarılmış durum erişmek için herhangi bir şekilde var bir yığın izleme oluşturur?

Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
__builtin__.IOError: File Does not exist. 
Exception wrapped by: 
    File "<stdin>", line 4, in <module> 
__main__.ConfigError: Give me my config, user! 

DÜZENLEME:

i yenilgiye çalışıyorum sorun bazı 3. parti kodu ı temel nedenini belirlemek için mümkün istiyorum 3 defaya kadar istisnalar sarın ve olmasıdır, yani genel bir yolu istisna yığınını denetlemek ve 3. taraf modüllere herhangi bir ekstra kod eklemeniz gerekmeden bir istisnanın temel nedenini belirlemek.

+0

sys.last_traceback yardımı yapmıyor mu? –

+0

da belki [python traceback modülü] 'ne bakabilirsiniz (http://docs.python.org/library/traceback.html?highlight=traceback) –

+0

Üzgünüm, bu can sıkıcı sorulardan biri, ama ... neden? – senderle

cevap

11

Bu İstisna Zincirleme olarak bilinir ve Python 3'te suported olduğunu

PEP 3134: http://www.python.org/dev/peps/pep-3134/ kaydetmek sürece, yeni bir zam ne zaman Python 2'de, eski istisna kaybolur

except bloğunda.

+0

Çok havalı! –

+2

'u paylaştığınız için teşekkür ederiz Ne demek "onu istisna bloğunda sakla" ile kastediyorsunuz? Bunu yapmak için standart bir yol var mı? –

5

tracebackmodule'u kullanın. En son geri izlemeye erişmenizi ve bir dizede saklamanızı sağlar. Örneğin,

import traceback 
try: 
    config_file = open('config.ini', 'r') 
except OSError: 
    tb = traceback.format_exc() 
    raise ConfigError('Give me my config, user!',tb) 

"iç içe" traceback

tb saklanır ve bunu ancak istediğiniz çalışabilir ConfigError, geçti.

+0

Ayrıca, format_exc() (tb'de saklanan) sonucu sadece bir dizgidir. Bir try/except bloğunda olmasaydı yazdırılacak olan tam olarak aynı metnin. – austin1howard

+0

Düzenlemenizi yanıtlamak için, bildiğim kadarıyla, format_exc işlevi tüm geri bildirimlerdeki geribildirimde bilgi verecektir. Bir üçüncü taraf modülü, bir try/except döngüsündeki bazı bilgileri "bastırırsa", * özel * try/except döngüsünü değiştirmeden geri yükleyemezsiniz. – austin1howard

İlgili konular