Programlama dillerinde neden hatalar "İstisna" olarak adlandırılıyor ama "Hata" olarak adlandırılmıyor?


45

Aslında bir süredir bunu düşünüyorum. Ben anadili İngilizce olmayan bir konuşmacı değilim ama hala yıllarca programlama tecrübem var ve bunu hep sordum. Neden İstisna olarak adlandırılıyor, ancak hata olduklarından Hata olarak adlandırılıyorlar.

Bunun PageNotFoundErroryerine olabilir PageNotFoundException.


41
İstisnai durumların tümü hata değildir.
Andrew T Finnell

15
Arabayı döndürmekle arabayı çarpmak arasındaki fark bu.
Dünya Mühendisi,

6
Sadece özel istisna sınıflarının isimlendirilmesinden mi bahsediyorsunuz? Sonra bazı ekosistemlerde, bu dikkat edilir denilen XYErrorörneğin Python -.

6
Unutma, Java, Throwable'dan miras kalan bir Error sınıfına sahip. Daha fazla bilgi için docs.oracle.com/javase/1.4.2/docs/api/java/lang/Error.html adresini ziyaret edin. "Doğrudan Bilinen Alt Sınıflar" kategorisini de kontrol edebilirsiniz.
luiscubal

Bu bilmecenin İngilizce ile ilgisi olmadığını söylemek isterim. Daha çok, hangi dilde, hangi dilde uzman olmayı seçtiğinizi seçin.
אינתיא אבישגנת

Yanıtlar:


59

Hiç hata olmaları gerekmez. Sayfanın olmaması, gerçek bir hatadan ziyade ilginç bir gerçek olabilir. Neredeyse her zaman hata olarak kullanıldıklarını sanıyorum. Ancak bazen döngülerden kopmaya alışırlar veya bir dizgenin geçerli bir sayı olmadığını bildirirler. Oldukça normal geri dönüşün bir parçası olarak, çok miktarda yararlı veriyi tutmak ve geri göndermek için kullanılabilirler. (Bazı diller istisnalarıyla biraz yavaştır, bu durumda onları sık sık atmak kötü bir fikirdir.) Her halükarda teoride, bir istisna sadece "normal bir geri dönüş yapma, ilgilenen birini bulana kadar çağrı yığınını yükselt" anlamına gelir. bunda."

Boş bir işaretçi istisnası bile sizin için çok önemli olmayabilir. Başkasının kodunu çağırırsınız ve sonra boş bir işaretçi istisnası yakalarsınız, çünkü havaya uçurmanın, kimin hatası olduğunu söyleyen bir mesaj yazmanın ve devam etmenin ve işinizin yapılmasının uygun olduğunu bilirsiniz.


27
İstisna mekanizmalarının kontrol akışı olarak kullanılması kafa karıştırıcı olabilir ve bence genelde kaşlarını çattı.
ChaosPandion

11
@ChaosPandion: Dile / kültüre göre değişir.
amara

11
@DocBrown: Bir keresinde mevcut denemede çözümü bulamadığında ve farklı bir değerle yeniden denediğinde geriye dönük arama yapan özyinelemeli arama yapan bir sudoku çözücü yazdım; ve bir çözüm bulunduğunda, çözümü içeren bir istisna atar. Buradaki sorun “normal” durum ve başarı “istisnai” bir durum; ve çözücüde kendisini aradığı yerde çok sayıda nokta bulunduğundan, istisna kullanmadan, bir aramanın başarılı bir aramadan mı yoksa başarısız bir aramadan mı geri döndüğünü kontrol etmek için çok sayıda kazan plakası yazmanız gerekir.
Yalan

5
@Falcon: evet, sadece 'bitmiş' bir değere sahip olabilirsiniz, bu sadece her tekrarladığınızda, yapmanız gerekenler anlamına gelir: for (...) { if (func() == finished) { return finished; } else { itfailedsocheckanother(); }}ama func () fonksiyonunun tekrarlı olduğu kodda birden fazla nokta olduğunu göz önünde bulundurarak, istisnasız çözüm, daha fazla özyineleme eklediğinizde her zaman çirkinleşir. Yani aslında tarikat lideri "senin istisnalar kullanamaz" diyor çünkü zaten bir o bir dilde istisnalar taklit edilir Bir kargo-kült programlama diyoruz.
Yalan

8
@Falcon: Ah ... hisse senedi "Goto'ya benziyor" argümanı, bu argümanlar döngüleri kullanmamanız gerektiğini söylerken işe yarıyor, ifadeler veya işlev çağrıları yapıyor, çünkü "hepsi gotos gibi görünüyor". İstisna ile başarının döndürülmesi, istisna ile hataları ilişkilendirirseniz sadece bir WTF olur. Benim için, bu şekilde kullanıldığında, bir try-catch bloğu "uzun bir yolculuktan sonra buraya geri dönme sözü" gibi, try-exc + atma davranışı, bunun haricinde function-calls + return'lere oldukça benzer. çözüm arayışı bittiğinde çok derin bir çağrı yığını içerebilecek daha uzun yolculuklar.
Yalan

21

İstisnaların mekanizması her zaman hataları bildirmek için kullanılmaz. Hatalar dahil olmak üzere işlenmesi için ayrı bir kod yolu gerektiren olağan durumlarda istisnalar atılır. Örneğin, mevcut olmayan bir dosyanın adını sağlayan veya sayısal bir alana rakam yerine harf girmek yerine özel işlem gerektiren istisnai durumlardır, ancak bunlar hata değildir.

Java gibi bazı programlama ortamlarında, Errormakul bir uygulamanın ele almaması gereken durumlar "gerçek hataları" bildirmek için özel nesneler sağlanmıştır. Bu nesneler istisnalar sunmak için kullanılan aynı mekanizma kullanılarak teslim edilir, ancak kurtarılamaz durumların sinyallerinin özel bir anlamı vardır.


6

Bunun kökenleri hakkında etimolojik bir araştırmam yok, ancak “Hata” terimini kullanmanın her durumda kesin olamayabileceğini; Ayrıca almostSharepointMaster'ın da bahsettiği gibi, hatayı ve ayrılan varlıklar olarak atılan istisnayı düşünmek daha iyidir.

Yüksek seviyeli bir programlama dilinde olduğunuzda, bir istisnanın her zaman bir hatadan kaynaklandığını varsaymak mantıklıdır, bununla birlikte, bir istisna da her zaman bir hatanın sonucudur. Örneğin, işbirlikçi olarak konuları sonlandırmak için istisnalar kullanıyorum.

"İstisna" terimini ilk gördüğümde 80386 Montaj el kitabında yer aldı. Bunu gördüğümde bana anında doğal geldiğini hatırlıyorum. Bir hata yapmak doğru olmaz çünkü Meclis'te hata yoktur; İşlemcinin baş edemediği koşullar var (eğer bir hata ise - programlayıcıdan, kullanıcıdan veya sistemden - işlemcinin buna tamamen aykırı olduğu). Intel terimi gerçekten ortaya çıkmış mı, bilmiyor mu, bilmiyorum ama belki ...


3

İstisna İstisna, doğru olmayan ancak var olmayan out_of_rangebir vektör veya dizideki bir elemana erişilirken atılan C ++ 'daki bir istisna gibi, kurtarılabilecek bir olayı adlandırmak için kullanılır . Açıkçası, böyle bir olay doğru değildir, ancak gerçekleşen olay tüm programınızın çöktüğü anlamına gelmemelidir.

Öte yandan, hatalar genellikle her şeyi çökmesi gereken bir şeyi adlandırmak için kullanılır, yığın taşması gibi bir şey, programı programın içinde işleyemediği için programı sonlandırması gereken bir olay örneğidir. Başka bir deyişle: bir hata büyük, bir istisna nispeten küçüktür.


3

Bunun, hata işlemenin "evrimi" ile ilgisi olduğunu düşünüyorum. C / C ++ ile (istisna işleme eklenmeden önce) diller, eğer bir fonksiyon başarısız olursa, anlatmanın tek yolu geri dönüş değerinden (örneğin HRESULTwin32'de) geçmek . Normalde, her bir işlev çağrısının çıkış kodlarını yakaladınız ve bir kontrol yaptınız. Bu yaklaşım kod dağınık hale getirir. Ve çoğu zaman geliştiriciler bu çekleri tembelliğin dışında bırakmaktan kaçınacaktır.

İstisna işlemenin başlatılmasıyla birlikte, geliştiricilerin bir hata yapması için iki seçeneğe sahipti . Bu yüzden "istisna" kelimesi, hataları "çıkış durumu" hatalarından ayırmak için kullanıldı. Bir süre sonra, istisna işleme hataların yayılması için popüler bir yol haline geldi, çünkü kodun okunması, bakımı çok daha kolaydır ve hata işleme mantığına sahip olabileceğiniz tek bir yer olabilir.


2

Python'da bunlar ABCError Ör. Örneğin: KeyError, IndexError

http://docs.python.org/library/exceptions.html

Bu yüzden kullandığınız dile bağlı olduğunu düşünüyorum.


4
VB'yi unutma (klasik, Net değil). Hata durumunda Goto kullanıldı. Ve tüm zamanların en şaşırtıcı buluşu "Sırada Hata
Sırasında

1
Python'da hatalar bir istisnalar alt kümesidir. İstisna'dan miras alan ancak StandardError'dan miras almayan dört standart istisna vardır: StopIteration, GeneratorExit, KeyboardInterrupt ve SystemExit.
Dirk Holsopple

1

Bir hata oluştuğunda, sistem veya o anda çalışmakta olan uygulama, hata hakkında bilgi içeren bir istisna atarak bildirir. Bir istisna atıldığında, uygulama veya varsayılan istisna işleyici tarafından bir istisna ele alınır.

Bir hata, hatayı ayrıntılandıran bir istisnayı keser, bu yüzden her şey bir anlam ifade etmiyorsa istisna olan bir hatadır;

http://msdn.microsoft.com/en-us/library/system.exception.aspx


0

İOS / Mac programlarında, tek bir dilde hem İstisnalar hem de Hatalar var.

En azından bu ortamda bir istisna "kurtarılamaz" iken bir hata "kurtarılabilir".

Örneğin:

  • 10 öğeden oluşan bir diziniz varsa ve 30 dizinindeki öğeye erişmeyi denerseniz - bu bir istisna olacaktır. Programlamasında bir hata yaptın.
  • Bir URL indirmeye çalışırsanız, ancak internet bağlantısı yoksa, bu beklenen bir durumdur ve kullanıcıya bir tür mesaj göndermeniz gerekir.

Özel durumlar genellikle uygulamanızı çökertir, hatalar genellikle döner nilve bir hata nesnesi (başvuru yöntemi parametresi olarak döndürülür). Bir dene / yakala / nihayet bloğu ile istisnalar yakalayabilirsiniz ancak bu dil özelliğini kullanmamanız önerilir - bir istisnadan herhangi bir şekilde kurtulmak mümkün ise, o zaman bir istisna atmamalısınız (geri dönmelisiniz). bunun yerine bir hata nesnesi).


2
Öyleyse, İstisna ve Hataların diğer geliştiriciler için ne ifade ettiğinden tamamen farklı!
Tarik

Her dil farklı sanırım. Objective-C / Cocoa, aktif kullanımdaki en eski dillerden biridir (yaklaşık 1983), bu yüzden belki biraz eski modadır. Yine de, tanım bir topluluktan diğerine değişirse, bunu bilmek önemlidir.
Abhi Beckert

0

Bir hata , programın yürütülmesinde yanlış giden bir şeydir. Genelde bu bir istisna ortaya çıkarmakla uğraşır , ancak

  • bir programcıyı bir istisna oluşturarak bir hatayı işlemeye zorlayan hiçbir şey yoktur ve
  • bir programlayıcıyı yalnızca bir hata durumunda istisnalar ortaya çıkarmaya zorlayan hiçbir şey yoktur.

Hata anlamsal bir kavramdır: programa beklentilerle gelen programcı veya kullanıcı tarafından beklentileri ve gerçeklikleri arasındaki farkı tanımlamak için uygulanır. Bir kişi bir rutinin hata durumunda olup olmadığını söyleyebilir.

İstisna, sözdizimsel bir kavramdır: Programın kendisinde, programın ne yapması gerektiğine dair beklentilerinden bağımsız olarak bir şeydir. Bir rutin, birinin ne düşündüğünden bağımsız olarak, bir istisna yaratır veya yaratmaz.


0

İstisnalar ve hatalar farklı.

İstisnalar, bir dosyayı açmaya çalıştığınız ve var olmadığı gibi programın üstesinden gelebilecek durumlardır, hatalar ise bir programın bir disk arızası veya RAM arızası gibi hiçbir şey yapamayacağı durumlardır.


0

İstisnaları kaldırmak ve ele almak, kontrol akışı özellikleridir ve istisnanın adı amaçlanan kullanımı takip etmelidir. Kod ve API tasarımcısı iyi ve tutarlı adlandırma düzenleri bulmalıdır.

Yani sorunuzun cevabı şudur: bu bağlam ve bakış açısına bağlıdır.


0

İstisnalar, hataların genelleştirilmesi olarak gelişti. Bir istisna mekanizması içeren ilk programlama dili 1970'lerin başında Lisp oldu. Gabriel ve Steele'in Bir Dil Gelişimi Örüntüsünde iyi bir özet var.. İstisnalar (henüz istisnalar olarak adlandırılmadı), bir hata meydana gelirse bir programın davranışını belirleme gereğinden doğmuştur. Bir olasılık programı durdurmaktır, ancak bu her zaman yardımcı olmuyor. Lisp uygulamaları geleneksel olarak hata ayıklayıcısına bir hatayla girmenin bir yolunu buldu, ancak bazen programcılar programlarına hata işlemeyi dahil etmek istediler. Öyleyse 1960'larda Lisp uygulamaları “bunu yapın ve bir hata olursa o zaman bunu yapın” demenin bir yolu vardı. Başlangıçta hatalar ilkel işlevlerden geldi, ancak programcılar programın bir bölümünü atlamak ve hata işleyicisine atlamak için kasıtlı olarak bir hatayı tetiklemenin uygun olduğunu gördüler.

1972'de Lisp'teki modern istisna yönetimi MacLisp'te ortaya çıktı: throwve catch. Yazılım Koruma Grubu dahil erken Lisp uygulamaları, üzerinde birçok materyal listeler David Moon MACLISP Referans El Revizyon 0 . İlkel catchve throw§5.3 sayfa 43'te belgelenmiştir.

catchyapılandırılmış yerel olmayan çıkışlar yapmak için LISP işlevidir. (catch x)değerlendirme xsırasında değerlendirilmesi x (throw y)gereken durumlar dışında, değerlendirme yapılmadan catchderhal geri ydönmesi dışında değerlerini değerlendirir ve verir x.

catchiç içe geçmiş avları birbirinden ayırmak için bir etiket olarak kullanılan, değerlendirilmemiş, bir eşdeğer argümanıyla da kullanılabilir. (...)

throwcatchyapısal bir yerel olmayan çıkış mekanizması olarak kullanılır .

(throw x)xdeğeri değerlendirir ve en yeniye geri döndürür catch.

(throw x <tag>)xgeri değerini, catchetiketli <tag>veya etiketsiz olarak etiketlenmiş en son değere atar .

Odak lokal olmayan kontrol akışı üzerinde. Bu, bir sıçrama olarak da adlandırılan bir goto şeklidir (sadece yukarı doğru bir goto) . Mecaz programının bir parçası olmasıdır atar istisna işleyicisi dönmek için değeri ve istisna işleyicisi yakalar bu değer ve iadeler o.

Günümüzde çoğu programlama dili, bir istisna nesnesindeki etiketi ve değeri paketler ve yakalama mekanizmasını bir taşıma mekanizmasıyla birleştirir.

İstisnalar mutlaka hata değildir. Bir kod bloğundan ve çevresindeki bloklardan çıkmanın bir istisnası için işleyiciye ulaşana kadar kaçmanın bir yoludur. Böyle bir şeyin sezgisel anlamda “hata” olarak kabul edilip edilmediği özneldir.

Bazı diller “hata” ve “istisna” terimleri arasında ayrım yapar. Örneğin, bazı Lisp lehçelerinin hem throwbir istisna oluşturması (kullanıcılar için kontrol akışını, herhangi bir şeyin “yanlış” gittiğini göstermeyecek şekilde yerel olmayan bir çıkış gerçekleştirmesi anlamına gelmesi) ve hem signalde bir hata oluşturması gerekir (ki bu bir şey “ters gitti” ve hata ayıklama olayı tetikleyebilir).


-1

Farklı programlama dili uygulamalarında farklı yorumlandığını göreceksiniz. Dasblinkenlight'ın söylediği gibi, bu, Error ile İstisna arasında bir sınır olduğunu gösteren java bakış açısıdır. Pek çok programlama dilinde istisnalar, mümkün olan en yüksek kod modülüne geçmek için ele alınabilen veya köpürtülmeye izin verilen ihlallerdir. Hatalar genellikle dilinizin çalışma zamanı kabının işlediği durumlardır (ve çoğu durumda yürütmeyi durdurur).


-1

Bir hata her zaman bir hatadır. İstisna, mevcut bağlamdaki hatadır. Yani, bir istisna içeriğe duyarlıdır. Bir istisna örneği, "1" tamsayısına "a" ascii eklemek olabilir. Bir hata "+!" Gibi tanımsız bir operatör kullanma gibi bir şey olabilir. çoğu dilde

Bazı dilimler, gerçekten yapmak istediğiniz şeyse durumdan çıkış yolunuzu tanımlamanıza izin verecektir.

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.