Hariç: ve Dışında arasındaki fark e: Python'da istisna olarak


140

Aşağıdaki kod snippet'lerinin her ikisi de aynı şeyi yapar. Her istisnayı yakalarlar ve except:bloktaki kodu çalıştırırlar

Snippet 1 -

try:
    #some code that may throw an exception
except:
    #exception handling code

Snippet 2 -

try:
    #some code that may throw an exception
except Exception as e:
    #exception handling code

Her iki yapıdaki fark tam olarak nedir?


7
@ user2725093 bu aynı soru değil. Eğer bağlı bir arasındaki fark ne sorar except Exception, e:ve except Exception as e:. Bu soru except:ve arasındaki farkın ne olduğunu sorar except Exception as e:.
Dennis

Yanıtlar:


155

İkincisi, istisna nesnesinin niteliklerine erişebilirsiniz:

>>> def catch():
...     try:
...         asd()
...     except Exception as e:
...         print e.message, e.args
... 
>>> catch()
global name 'asd' is not defined ("global name 'asd' is not defined",)

Ama yakalamıyor BaseException veya sistem çıkarken istisnalar SystemExit, KeyboardInterruptve GeneratorExit:

>>> def catch():
...     try:
...         raise BaseException()
...     except Exception as e:
...         print e.message, e.args
... 
>>> catch()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in catch
BaseException

Bunun dışında çıplak olan:

>>> def catch():
...     try:
...         raise BaseException()
...     except:
...         pass
... 
>>> catch()
>>> 

Daha fazla bilgi için dokümanların Yerleşik İstisnalar bölümüne ve öğreticinin Hatalar ve İstisnalar bölümüne bakın.


22
Burada sihir yok. Exceptiontüretilmiştir BaseException, bu yüzden except Exceptionyakalamaz BaseException. Eğer yazarsan except BaseException, o da yakalanacak. Çıplak excepther şeyi yakalar.
fjarri

2
Diğer bloklardan önce koyarsanız bir hata almayacakken, exceptbir dizi exceptblokta çıplak olması gerektiğini belirtmeliyim : sadece sessizce göz ardı edilecekler (eğer alt sınıfları ele alırlarsa ). Dikkat edilecek bir şey. except ExceptionexceptException
Vanessa Phipps

@MatthewPhipps Bu bir nokta, değil mi? vaka ifadeleri veya if-else blokları gibi, yürütme eşleşen ilk koşula atlar ...
Temel

1
@Basic Sadece çıplak exceptve arasındaki başka bir fark işaret except Exception. "Dikkat edilmesi gereken bir şey" şimdi biraz garip görünüyor, ancak o zaman Python'un exceptnerede olduğuna bakılmaksızın en spesifik bloğu seçmesini bekledim ve aksi halde biraz hayal kırıklığına uğradım.
Vanessa Phipps

Ayrıca, ikinci formun yalnızca istisnanın ne olduğunu umursamıyorsanız veya anlamlı bir şekilde ele almak istemeniz durumunda kullanılması gerektiğini belirtmek gerekir.
Josh J

51
except:

oysa tüm istisnaları kabul eder

except Exception as e:

Sadece olduğunuzu istisnaları kabul anlamına mandala.

İşte size yakalamak istemediğiniz bir örnek:

>>> try:
...     input()
... except:
...     pass
... 
>>> try:
...     input()
... except Exception as e:
...     pass
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyboardInterrupt

Birincisi susturdu KeyboardInterrupt!

İşte hızlı bir liste:

issubclass(BaseException, BaseException)
#>>> True
issubclass(BaseException, Exception)
#>>> False


issubclass(KeyboardInterrupt, BaseException)
#>>> True
issubclass(KeyboardInterrupt, Exception)
#>>> False


issubclass(SystemExit, BaseException)
#>>> True
issubclass(SystemExit, Exception)
#>>> False

Bunlardan herhangi birini yakalamak istiyorsanız, en iyisi

except BaseException:

ne yaptığınızı bildiğinizi belirtmek için.


Tüm istisnalar kaynaklanıyor BaseExceptionve bu size (atılmış olacak olanlar gün be gün catch gerekiyordur için programcı) den çok devralır Exception.


except(Exception)asla KeyboardInterrupthataları yakalamaz . as eonunla hiçbir ilgisi yok.
pandita

2
Bunu asla söylemedim. Bir keresinde bahsetmedim as e, çünkü ne yaptığını açıkça gördüm.
Veedrac

2
Bir kişinin BaseException'ı yakalayacağı ve ne yaptığını bildiği bir durum var mı?
Davos

2
@Davos Evet, geçici günlük kaydı yaparken veya kullanıcıya istisnalar SystemExitveya KeyboardInterruptkaçmak istemediğiniz bir konsol sunuyorsanız tercih edebilirsiniz . Yaygın bir durum değil, ama oluyor.
Veedrac

14

Bazı istisnalar dışında farklılıklar vardır, örneğin KeyboardInterrupt.

Okuma PEP8 :

Şunlar haricinde bir bare: SystemExit ve KeyboardInterrupt istisnalarını yakalar, bir programı Control-C ile kesmeyi zorlaştırır ve diğer sorunları gizleyebilir. Program hatalarını gösteren tüm istisnaları yakalamak istiyorsanız, Exception: (hariç çıplak BaseException dışında eşdeğerdir) kullanın.


3

İkinci formu kullanmak size (dayalı adında bir değişken verir assizin örnekte, fıkra eolarak) exceptSizin istisna (tip, mesaj, yığın izlemesi, vb) infomration kullanabilmesi kendisine bağlı istisna nesnesi ile blok kapsamı daha özel hazırlanmış bir malikanede istisnayı ele alın.


1

Buna bakmanın başka bir yolu. İstisnanın ayrıntılarına göz atın:

In [49]: try: 
    ...:     open('file.DNE.txt') 
    ...: except Exception as  e: 
    ...:     print(dir(e)) 
    ...:                                                                                                                                    
['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', 'args', 'characters_written', 'errno', 'filename', 'filename2', 'strerror', 'with_traceback']

'As e' sözdizimini kullanarak erişebileceğiniz pek çok "şey" vardır.

Bu kod yalnızca bu örneğin ayrıntılarını göstermek içindir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.