2016-08-03 23 views
14

piton dil referans durumları: Bir ifade ile except bir İçinNeden nesne Python'daki her şeyi yakalamaz? <a href="https://docs.python.org/2.7/reference/compound_stmts.html#the-try-statement" rel="nofollow">section 7.4</a> yılında

, bu ifade değerlendirilir ve ortaya çıkan nesne haricinde “uyumlu” ise hüküm istisna eşleşir. Bir nesne, istisna nesnesinin sınıfı veya temel sınıfı veya istisna ile uyumlu bir öğe içeren bir tuple ise bir istisna ile uyumludur.

Neden except object: her şeyi yakalamıyor? object, tüm özel durum sınıflarının temel sınıfıdır, bu nedenle except object: her özel durumu yakalayabilmelidir.

Örneğin, bu AssertionError

print isinstance(AssertionError(), object) # prints True 
try: 
    raise AssertionError() 
except object: 
    # This block should execute but it never does. 
    print 'Caught exception' 
+4

ve 'Nesnesi' bir istisna türü değil. Yine de bunun neden bir 'TypeError' tetiklemediğinden emin değilim. – user2357112

+1

Bu, yalnızca 2.x'te çalışır. 3.x'te bir TypeError atar. Benim varsayım, bazı eksik sihirli yöntem nedeniyle başarısız olur, ama ben hangisi (ler) söyleyemedim. AssertionError, 'object'' {'__setstate__', 'args', '__context__', '__suppress_context__', '__dict__', '__cause__', 'with_traceback', '__traceback __'} 'karakterine sahip olmayan aşağıdaki özniteliğe sahiptir. , bu yüzden onlardan biri olduğunu farz ediyorum. –

+3

2.x özel durum işleminde bir hataya benziyor. Python 3 istisnasız türleri yakalamak için doğru kontrollere sahiptir. Python 2 sadece sessizce yanlış şeyi yapar. – user2357112

cevap

3

Cevabın source code for python 2.7 bulunabilir inanıyoruz yakalamak olmalıdır:

 else if (Py_Py3kWarningFlag && 
       !PyTuple_Check(w) && 
       !Py3kExceptionClass_Check(w)) 
     { 
      int ret_val; 
      ret_val = PyErr_WarnEx(
       PyExc_DeprecationWarning, 
       CANNOT_CATCH_MSG, 1); 
      if (ret_val < 0) 
       return NULL; 
     } 

yüzden wexcept açıklamada ifadesini varsayıyorum) ise bir tuple veya istisna sınıf ve Py_Py3kWarningFlag ayarlanır ve sonra geçersiz bir istisna türü kullanmaya çalışıyorum dışında bir blok gösterecektir ing.

bayrak dosyası yürütme -3 işaretini ekleyerek ayarlanır Yani

: Bir istisna vardır yazın koymak gerekir

Tadhgs-MacBook-Pro:~ Tadhg$ python2 -3 /Users/Tadhg/Documents/codes/test.py 
True 
/Users/Tadhg/Documents/codes/test.py:5: DeprecationWarning: catching classes that don't inherit from BaseException is not allowed in 3.x 
    except object: 
Traceback (most recent call last): 
    File "/Users/Tadhg/Documents/codes/test.py", line 4, in <module> 
    raise AssertionError() 
AssertionError 
+0

"Varsayılan" durumuna düşmüyor; Artık kaldırılan dize istisnaları için eski kod yolunu kullanarak biten PyErr_GivenExceptionMatches (v, w) 'ye gider. – user2357112

+0

Evet, daha uzun bir kod göz attıktan sonra fark ettim.Kesinlikle ilgili kod linkleri ile yanlış/yanlış bir cevap gönderme düşündüm sizin gibi insanlar beni düzeltmek olabilir: D –

+0

Strangely, Python 2 bir 'except' ifadesi için hemen hemen her şeyi koymak izin veriyor gibi görünüyor, ama Bir istisna türü olmayan bir tür verirseniz sessizce belgelere davranır. Python 2'nin şu andaki sadece bakım durumunda olmasına rağmen, belgelerin en azından güncellenmesi gerekir, muhtemelen davranışa bir şey yapmaya değmez. – user2357112

İlgili konular