Python istisnaları neden "Hata" olarak adlandırılır?


82

Python istisnalar "Hata" (örneğin adlandırılır Neden ZeroDivisionError, NameError, TypeError) ve "İstisna" (örneğin ZeroDivisionException, NameException, TypeException).

Java geçmişinden geliyorum ve son zamanlarda Python öğrenmeye başladım, çünkü bu kafa karıştırıcı çünkü Java'da hatalar ve istisnalar arasında bir ayrım var.

Python'da da bir fark var mı yok mu?

Yanıtlar:


95
  1. Her sınıfı adında 'Sınıf' ve her değişkeni adında '_variable' ile adlandırmazsınız. Aynı şekilde, 'İstisna' kelimesini kullanarak istisnayı adlandırmazsınız. Bir isim, bir nesnenin anlamı hakkında bir şeyler söylemelidir. "Hata" çoğu istisnanın anlamıdır.

  2. İstisnaların tümü Hata değildir. SystemExit, KeyboardInterrupt, StopIteration, GeneratorExitTüm istisnalar ve olmayan hatalardır. Gerçek hatalardaki 'Hata' kelimesi farkı gösterir.

  3. "Hata", "Özel Durum" dan daha kısadır. Bu, kod genişliğindeki birkaç karakteri anlam kaybı olmadan kaydedebilir. Bu biraz fark yaratır.


2
Tüm İstisnalar Hata Değildir : Aslında, adlandırılmış bir istisna sınıfından türetilen birkaç istisna vardır Warning. Bakınız cevabımı .
DavidRR



49

Bu sözleşmenin PEP 8 - Python Kodu için Stil Kılavuzu'ndan geldiğine inanıyorum :

İstisna Adları

İstisnaların sınıf olması gerektiğinden, sınıf adlandırma kuralı burada geçerlidir. Ancak, istisna adlarınızda "Hata" sonekini kullanmalısınız (istisna gerçekte bir hataysa).


8

Python, bu bakımdan Java'ya oldukça benzer. Ancak Python'un İstisnası, Java'nın Fırlatılabilir'i ile karşılaştırılmalıdır.

Fırlatılabilirler her türlü tatta geldikçe - Hata, Çalışma Zamanı Özelliği ve (işaretli) İstisna - Python'unki de öyle (kontrol edilen istisnalar olmasa da).

Dile gelince, bir Hata istisnaidir, bu nedenle kalıtım hiyerarşisi garip değildir.

Yine de Exception ismini pek sevmiyorum. İstisnalar sadece istisnai durumlar (umarız Hatalar gibi) için değil, aynı zamanda kontrol akışının dışına çıkmak için de kullanılır. Çünkü bir İstisna'nın yaptığı budur; normal kontrol akışından işaretli bir noktaya atlar. Biraz goto gibi ama daha rafine.

Bununla birlikte, uygun bir dönüş değerinin bulunmadığı bir durumla karşılaştığınız her seferinde bir İstisna kullanma eğilimindesinizdir. Hem Python'da hem de Java'da.


-1; Bunun yararlı bir fikir verdiğini düşünmüyorum. Açıkça tanımlamadan 'istisnai durumlardan' bahsediyorsunuz, istisnaların nasıl işlediğine dair bir açıklama yapıyorsunuz ("normal kontrol akışından işaretli bir noktaya atlayın") bu gerçekten doğru değil, Hata ile Hata arasındaki ayrımı Java'da RuntimeException, Python'da benzer bir ayrım varmış gibi (yok) ve aslında Python'un istisnalarının neden genellikle Errorkendi adlarında olduğu sorusuna asla cevap vermiyorsunuz .
Mark Amery

4

S. Python istisnaları neden "Hata" olarak adlandırılır?

Sanırım bunun nedeni çoğu Python istisnasının hata veya uyarı olarak sınıflandırılmasıdır . Python istisnalarının isimleri bitecek Exceptionolsaydı, bu ayrım mümkün olmazdı.

Uyarı örnekleri DeprecationWarningve ImportWarning.

Lütfen yerleşik istisnalar için 2.x sınıf hiyerarşisine ve 3.x için olana bakın .


3

Basit ifadeyle:

  • Python istisnaları "Hata" olarak adlandırılmaz.
  • Python hataları "Hata" olarak adlandırılır.
  • Python hataları istisna olarak yükseltilebilir, yakalanabilir ve ele alınabilir.
  • Bir hata olarak başlayan bir şey, bir hata mesajıyla sonuçlanmayan, işlenen bir istisna haline gelebilir.
  • Bir Exceptionde doğrudan kaldırılabilir

Konsept:

Normalde bunu yaparım ama bir istisna yapacağım

VEYA

Bu normalde bir hata olurdu, ancak bir istisna yapacağız, yakalayacağız ve bazı prosedürler uygulayacağız.

Detaylar:

İstisnalar ve Hatalar:

https://docs.python.org/2/tutorial/errors.html

Yürütme sırasında tespit edilen hatalara istisna denir ve kayıtsız şartsız önemli değildir

İş akışı:

  • Program hataları izler.
  • Bir hata oluşursa, ancak yürütme sırasında program tarafından algılanmazsa, bir hata mesajıyla sonuçlanır.
  • Bir hata oluşursa ve yürütme sırasında program tarafından tespit edilirse, bu bir istisnadır.
  • İstisnalar program tarafından ele alınabilir. Nazikçe ele alınabilir veya bir hata mesajı ile sonuçlanabilir.
  • Program tarafından ele alınmayan istisnalar , işlenmemiş ( yakalanmamış ) istisnalardır ve hata mesajları haline gelir.

1

Bu sadece adlandırma. Java'da, java.lang.Errordiğer Throwablehatalardan farklı olursunuz çünkü bu tür hataların kontrol edilmemesi gerekir. Python'da tüm istisnalar kontrol edilmemiştir, bu nedenle ayrım anlamsızdır.


Temel sınıfa İstisna denir (diğer cevap hakkındaki yorumuma bakın) öyleyse neden çocukları da İstisna olarak adlandırmıyorsunuz?
Elena

@Elena: Çünkü o zaman sonunda buna benzer bir şey bulursunuz class ExceptionHandlingException extends RuntimeExceptionve bu okumak çok korkunç.
Esko

2
Başkaları tarafından yayınlanan diğer nedenlerin yanı sıra, Python standart kitaplığındaki isimlendirmenin her zaman tutarlı olmadığını unutmayın.
gustafc
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.