2014-10-21 16 views
6

Bu neden çalışmıyor?Neden istisna mesajında ​​bilgi eklemek için çalışmıyor?

try: 
    1/0 
except ZeroDivisionError as e: 
    e.message += ', you fool!' 
    raise 

Değiştirilen mesaj istisna örneğinde kalmasına rağmen kullanılmaz. Yukarıdakiler için bir çalışma modeli var mı?

Ben python3 içinde exception chaining farkındayım
try: 
    1/0 
except ZeroDivisionError as e: 
    args = e.args 
    if not args: 
     arg0 = '' 
    else: 
     arg0 = args[0] 
    arg0 += ', you fool!' 
    e.args = (arg0,) + args[1:] 
    raise 

, bu güzel görünüyor ama ne yazık ki python2 çalışmaz: Davranış aşağıda benim şimdiki çözüm gibi olmalıdır. Öyleyse python2'deki bir istisnayı yeniden gündeme getirme alışkanlığı nedir?

Not: Çünkü here belirtilen uyarı ve uyarılar, yeni bir istisna Traceback kazıp ve yaratmak istemiyorum ziyade mevcut istisna örneğini yeniden yükseltmek.

cevap

4

e.args'un değiştirilmesi, bunu yapmanın tek yoludur. implementation for BaseException.__str__ sadece args tuple gördüğü, hiç message bakmaz:

static PyObject * 
BaseException_str(PyBaseExceptionObject *self) 
{ 
    PyObject *out; 

    switch (PyTuple_GET_SIZE(self->args)) { 
    case 0: 
     out = PyString_FromString(""); 
     break; 
    case 1: 
     out = PyObject_Str(PyTuple_GET_ITEM(self->args, 0)); 
     break; 
    default: 
     out = PyObject_Str(self->args); 
     break; 
    } 

    return out; 
} 

Bu Python 2.6 beri BaseException.message is deprecated beri çok beklenmedik olmamalıdır.

0

Bunun geçici çözümünüzden daha iyi bir çözüm olacağını düşünmüyorum. ZeroDivisionError, çıktısını oluşturmak için message özelliğini kullanmaz, bu nedenle hiçbir değişiklik olmayacaktır. Özellikle bir ZeroDivisionError alıcı ediyorsanız aşağıdaki daha özlü versiyonu çalışacak böylece

her zaman tek bir argüman olmalıdır:

try: 
    1/0 
except ZeroDivisionError as e: 
    e.args = (e.args[0] + ', you fool!',) 
    raise 

Eğer ZeroDivisionError özelliklerini kontrol Eğer onunla sahiptir, args ve message vardır message'u yeni bir hata oluşturmayacak kadar kısa bir süre kullanmıyor, değiştirme işlemlerini değiştirmek mümkün olan tek çözüm.

İlgili konular