Genel istisnaları yakalamak gerçekten kötü bir şey midir?


56

Genellikle çoğu kod analizi uyarısına katılıyorum ve bunlara uymaya çalışıyorum. Ancak bununla daha zor zamanlar geçiriyorum:

CA1031: Genel istisna türlerini yakalamayın

Bu kuralın gerekçesini anlıyorum. Ancak uygulamada, atılan istisnadan bağımsız olarak aynı işlemi yapmak istersem, neden her birini özel olarak ele alacağım? Ayrıca, belirli istisnaları ele alırsam, aradığım kod gelecekte yeni bir istisna oluşturmak üzere değişirse ne olur? Şimdi bu yeni istisnayı ele almak için kodumu değiştirmem gerekiyor. Oysa basitçe yakaladıysam Exceptionkodumu değiştirmek zorunda değilsin.

Örneğin, Foo Bar'ı çağırırsa ve Foo'nun Bar tarafından atılan istisna türünden bağımsız olarak işlemeyi durdurması gerekiyorsa, yakaladığım istisna türüne özgü olmanın herhangi bir avantajı var mı?

Belki daha iyi bir örnek:

public void Foo()
{
    // Some logic here.
    LogUtility.Log("some message");
}

public static void Log()
{
    try
    {
        // Actual logging here.
    }
    catch (Exception ex)
    {
        // Eat it. Logging failures shouldn't stop us from processing.
    }
}

Burada genel bir istisna yakalamazsanız, mümkün olan her türlü istisnayı yakalamanız gerekir. Patrick'in OutOfMemoryExceptionbu şekilde ele alınmaması gereken iyi bir noktası var . Peki ya istisnaları görmezden gelmek istersem ama OutOfMemoryException?


12
Ne hakkında OutOfMemoryException? Her şeyle aynı kullanım kodu?
Patrick

@Patrick İyi nokta. Sorunuza cevap vermek için soruma yeni bir örnek ekledim.
Bob Horn

1
Genel istisnalar yakalamak, herkesin ne yapması gerektiği hakkında genel açıklamalar yapmak kadar kötü. Genelde her şeye tek beden uyan bir yaklaşım yoktur.

4
@Patrick olurdu OutOfMemoryErrorayrı olan Exceptionbu sebeple miras ağacının
Darkhogg

Peki ya Ctrl-Alt-Del gibi klavye istisnaları?
Mawg

Yanıtlar:


33

Bu kurallar genellikle iyi bir fikirdir ve bu nedenle takip edilmelidir.

Ancak bunların genel kurallar olduğunu unutmayın. Tüm durumları kapsamıyorlar. En yaygın durumları kapsarlar. Belirli bir durumunuz varsa ve tekniğinizin daha iyi olduğu argümanını yapabilirseniz (ve bunu yapmak için argümanınızı ifade etmek için kodda bir yorum yazabilmelisiniz) sonra yapın (ve ardından hakem değerlendirmesini yapın).

Argümanın karşı tarafında.

Yukarıdaki örneğinizi, bunun için iyi bir durum olarak görmüyorum. Kayıt sistemi arızalıysa (muhtemelen başka bir istisna kaydı varsa), o zaman uygulamanın devam etmesini istemiyorum. Kullanıcının ne olduğunu görebilmesi için istisnadan çıkın ve çıktıya yazdırın.


2
Hemfikir olmak. Çok az az , şimdi bu normal günlük çevrimdışı vereceğiz hükmün çeşit yapmak olduğunu bazı else if şey stderr'e, ayıklama çıkışın çeşidini.
Shadur

6
İkinizi de yenildim, ancak kullanıcılar değil geliştiriciler gibi düşündüğünüzü düşünüyorum. Bir kullanıcı genellikle, uygulama kullanılabilir olduğu sürece günlüğe kaydetmenin gerçekleşip gerçekleşmeyeceği ile ilgilenmez.
Mawg

1
İlginçtir ki, log4net açıkça günlük kaydı başarısız olduğu için uygulamayı durdurmak istemez. Ve sanırım ne kaydettiğinize bağlı; Güvenlik denetimleri, elbette, işlemi sonlandırır. Ama hata ayıklama günlükleri? Bu önemli değil.
Andy

1
@Andy: Her şey ne yaptığınıza bağlıdır.
Martin York

2
Neden onları anlamıyorsun? Ve bunu yapmak için çaba sarf etmemelisiniz?
Mawg

31

Evet, genel istisnaları yakalamak kötü bir şey. İstisna, genellikle programın istediğinizi yapamayacağı anlamına gelir.

Başa çıkabileceğiniz birkaç istisna türü vardır :

  • Ölümcül istisnalar : bellek yetersiz, yığın taşması, vb. Durumu iyileştiremezsin bu yüzden vazgeç
  • İstisna atılan istisna çünkü kullandığınız koddaki hatalar : Bunları ele almaya çalışmayın, sorunun kaynağını düzeltin. Akış kontrolü için istisnalar kullanmayın
  • İstisnai durumlar : Bu durumlarda sadece istisna durumlarını ele alın. Buraya şunları ekleyebiliriz: ağ kablosu takılı değil, internet bağlantısı çalışmıyor, izinler eksik.

Oh, ve genel bir kural olarak: Eğer bir istisna ile ne yapacağınızı bilmiyorsanız, hızlı bir şekilde başarısız olmanız daha iyi olur (istisnayı arayan kişiye iletin ve halletmesine izin verin).


1
Soruda spesifik durum ne olacak? Günlük kodunda bir hata varsa, istisnanın dikkate alınmaması olasıdır, çünkü asıl önemli olan kod bundan etkilenmemelidir.
svick

4
Neden bunun yerine günlük kodundaki hatayı düzeltmiyorsunuz?
Victor Hurdugaci

3
Victor, muhtemelen böcek değil. Günlüğün üzerinde çalıştığı diskte yer kalmazsa, günlük kodunda bir hata var mı?
Carson63000,

4
@ Carson63000 - evet, evet. Günlükleri yazılmıyor, bu nedenle: hata. Sabit boyutlu dönen kütükler uygulayın.
Eylül'de

5
Bu en iyi cevap imo, ancak çok önemli bir yönü eksik: güvenlik . Programınızı hızlandırmaya çalışan kötü adamların bir sonucu olarak ortaya çıkan bazı istisnalar vardır. Eğer başaramadığınız bir istisna atılırsa, o zaman artık bu koda güvenemezsiniz. Kötü adamların girmesine izin veren kodu yazdıklarını kimse duymaktan hoşlanmaz.
riwalk

15

En üstteki dış döngü, hepsini basabilmek için bunlardan birine sahip olmalı ve daha sonra korkunç, şiddetli ve NOISY ölümü (bu olmamalı ve birinin duyması gerektiği gibi) ölmelidir.

Aksi takdirde, genel büyük olasılıkla gibi çok dikkatli olmalı değil bu konumda olabilirdi ve bu nedenle büyük olasılıkla doğru tedavi olmaz şeyi beklenen. Mümkün olduğu kadar spesifik olun, böylece yalnızca olacağını bildiğinizleri yakalayın ve yukarıda belirtilen gürültülü ölüme kadar kabarcıktan önce görülmeyenleri yakalayın .


1
Buna teoride katılıyorum. Peki ya yukarıdaki günlük kaydı örneğime? Basit olarak, günlük tutma istisnalarını yok saymak ve devam etmek istiyorsanız? Daha ciddi istisna balonunun kabarmasına izin verirken atılabilecek her bir istisnayı yakalamanız ve bunların her birini ele almanız gerekir mi?
Bob Horn

6
@BobHorn: Buna bakmanın iki yolu. Evet, günlüğe kaydetmenin özellikle önemli olmadığını ve başarısız olması durumunda uygulamanızı durma noktasına getirmemesi gerektiğini söyleyebilirsiniz. Ve bu yeterince adil bir nokta. Ancak, başvurunuz beş ay boyunca giriş yapamazsa ve hiçbir fikriniz yoksa? Bunun olduğunu gördüm. Ve sonra kütüklere ihtiyacımız vardı. Afet. Günlüğe kaydetmeyi durdurmak için aklınıza gelebilecek her şeyi yapmayı öneririm. (Ama bu konuda çok fazla fikir birliğine
varmayacaksınız

@pdr Günlüğe kaydetme örneğimde, genellikle bir e-posta uyarısı gönderirdim. Veya günlükleri izlemek için sistemlerimiz var ve bir günlük aktif olarak doldurulmuyorsa, destek ekibimiz bir uyarı alır. Bu yüzden günlüğe kaydetme sorununun başka yollarla farkına varırdık.
Bob Horn,

Oldukça yapmacık senin günlüğü örneği @BobHorn - için büyük boy gitmek, benim bildiğim en günlüğü çerçevelerini değil özel durumlar durum ve bunu yapacak kadar (böyle çağrılan olmaz herhangi bir "log deyimi dosya Y çizgi X meydana geldi" faydasız )

@pdr Günlük kaydı yapılandırması başarısız olursa, günlük çerçevesinin nasıl durdurulması gerektiğine ilişkin kayıt defteri listesindeki (Java) soruyu gündeme getirdim. İyi bir çözüm hala beklemede.

9

Kötü değil, sadece belirli avların daha iyi olması. Spesifik olduğunuzda, uygulamanızın ne yaptığını daha somut olarak anladığınız ve bunun üzerinde daha fazla kontrol sahibi olduğunuz anlamına gelir. Genel olarak, sadece bir İstisna'yı yakaladığınız, kayıt ettiğiniz ve devam ettiğiniz bir durumla karşılaşırsanız, muhtemelen bazı kötü şeyler oluyor. Bir kod bloğu veya yöntemin fırlayabileceğini bildiğiniz istisnaları özel olarak yakalarsanız, yalnızca günlük kaydı yapmak ve en iyisini ummak yerine , aslında kurtarabilirsiniz .


5

İki olasılık birbirini dışlayan değil.

İdeal bir durumda, yönteminizin üretebileceği tüm olası istisna türlerini yakalar, istisna başına ele alır ve sonunda catchgelecek veya bilinmeyen istisnaları yakalamak için genel bir madde eklersiniz . Bu şekilde her iki dünyanın da en iyisini elde edersiniz.

try
{
    this.Foo();
}
catch (BarException ex)
{
    Console.WriteLine("Foo has barred!");
}
catch (BazException ex)
{
    Console.WriteLine("Foo has bazzed!");
}
catch (Exception ex)
{
    Console.WriteLine("Unknown exception on Foo!");
    throw;
}

Daha özel istisnaları yakalamak için önce bunları koymalısınız.

Düzenleme: Yorumlarda belirtilen nedenlerden dolayı, son yakalamada bir yeniden inceleme eklendi.


2
Bekle. Neden hiç konsolosluk yapmak ve devam etmek için bilinmeyen bir istisna günlüğü oluşturmak istiyorsunuz? Kod tarafından atılmayacağını bile bilmediğiniz bir istisna ise, muhtemelen bir sistem arızasından bahsediyorsunuzdur. Bu senaryoda devam etmek muhtemelen çok kötü bir fikirdir.
pdr 09:12

1
@pdr Elbette bunun kesin bir örnek olduğunun farkındasın. Önemli olan, özel ve genel istisnaların yakalanmasını engellemek, onları nasıl idare edeceğini değil.
Rotem

@Remem Burada iyi bir cevabınız olduğunu düşünüyorum. Fakat pdr'nin bir noktası var. Kod, olduğu gibi, yakalama gibi görünmesini sağlar ve devam etmek iyidir. Bazı örnekler, bu örneği görmek, bunun iyi bir yaklaşım olduğunu düşünebilir.
Bob Horn

Katıldı ya da olmadı, cevabınızı yanlış yapıyor. Bellek Dışı ve Disk Dolu gibi istisnalar yakalamaya başladığınızda ve onları yutmaya başladığınızda, genel istisnaları yakalamanın neden kötü olduğunu kanıtlıyorsunuz.
pdr

1
Yalnızca oturum açmak için genel bir istisna yakalarsanız, oturum açtıktan sonra yeniden taramanız gerekir.
Victor Hurdugaci 9:12

5

Son zamanlarda aynı konuda duruyorum ve geçici sonucum, .NET İstisnası hiyerarşisinin ciddi şekilde berbat olduğu için tek sorunun ortaya çıktığı .

Örneğin, asılıyor atın olabilir bir istisna için makul bir aday yok çünkü, yakalamak istiyorum eğilimindedir kod ziyade meşru bir çalışma zamanı hatası bir hata gösterir. Ah evet. Öyleyse, bunun doğrudan bir sonucu olması dışında, tüm "mantıksal hataları" yakalamak için (veya yakalamamak) içine koyabileceğiniz hiçbir kova yoktur.ArgumentNullExceptionNullReferenceExceptionNullReferenceExceptionSystemException

Sonra IMNSHO orada büyük olmasının becerememek SEHException(via derived ExternalException) SystemExceptionve böylece "normal" haleSystemException Bir aldığınızdaSEHException, bir dökümü yazmak ve mümkün olduğunca hızlı sonlandırmak istiyorum - .NET 4 ile başlayan ve en azından bazı SEH istisnaları,yakalanmayacak Yolsuzluk Devlet İstisnaları olarak kabul edilir. İyi bir şey veCA1031kuralı daha da işe yaramazhale getiren bir gerçek, çünkü artık tembelinizcatch (Exception)bu en kötü türleri yakalayamayacak.

Ardından, diğer Çerçeve şeyler oldukça tutarsız ya türetir görünüyor Exceptiondoğrudan veya üzeri SystemExceptionşiddeti moot gibi bir şey tarafından yakalama maddeleri gruplama herhangi bir girişimi yapım.

Sayın Lippert tarafından parçası var C#şöhret denen Vexing İstisna o istisnaların bazı yararlı kategorizasyonlarını bırakır: Sen ... hariç, sadece "eksojen" olanları yakalamak istiyor iddia edilebilir C#dil ve .NET tasarım çerçeve istisnaları, herhangi bir şekilde “sadece dışsal olanları” yakalamayı imkansız kılar. (ve, örneğin, bir OutOfMemoryExceptionolabilir çok iyi bir şekilde büyük tamponlar ayrılmaz gereken bir API için tamamen normal bir kurtarılabilir hata olabilir)

Benim için Alt satırda yani, yolu C#catch blokları çalışmak ve Çerçeve istisna hiyerarşi tasarlanmıştır yolu, kural CA1031tamamen yararsız ötesinde . O süsü "istisnalar yutmayn" ama istisnalar yutma ama ne, sen yakalamak ne ilgisi sıfır sahip kök sorunun giderilebilmesi için daha sonra yapın:

Orada en az 4 yolu meşru bir yakalandı işlemek için Exceptionve CA1031sadece yüzeysel bir tanesini (yani yeniden atış harf) işlemek gibi görünüyor.


Bir yandan not olarak, o zamandan beri biraz daha geçerli olacak Özel Durum Filtreleri adında bir C # 6 özelliği CA1031vardır; bu nedenle, yakalamak istediğiniz istisnaları gerektiği gibi düzgün bir şekilde filtreleyebilecek ve filtrelenmemiş bir yazı yazmak için daha az neden olacaktır catch (Exception).


1
Büyük bir sorun, OutOfMemoryExceptionkodun "sadece" bir tanesinin başarısız olmaya hazırlandığı belirli bir tahsisin başarısız olduğunu gösterdiğinden emin olamayacağından emin olmamaktır. Daha ciddi başka bir istisna atılmış ve OutOfMemoryExceptionistif sırasında diğer istisnadan ayrılma meydana gelmiş olabilir. Java "kaynaklar ile deneyin" ile partiye geç kalmış olabilir, ancak istifleme sırasında .NET'ten biraz daha iyi gevşetme istisnaları ele alır.
supercat

1
@supercat - yeterince doğru, ancak bu, herhangi bir son blokta işler ters gittiğinde, diğer genel Sistem istisnaları için de geçerlidir.
Martin Ba

1
Bu doğru, ancak biri (ve genellikle de), finallyblokları gerçekçi bir şekilde gerçekleşmesini bekleyebilecek istisnalara karşı koruyabilir; Ne yazık ki, bunu yapmak genellikle kendi başına başarısızlıklara neden olabilecek bellek ayırma gerektirecektir.
supercat

4

Pokemon istisnası işleme (hepsini yakalaman lazım!) Kesinlikle her zaman kötü değildir. Bir yöntemi bir müşteriye gösterdiğinizde, özellikle son kullanıcı, uygulamanızın çökmesi ve yanması yerine her şeyi ve her şeyi yakalamak genellikle daha iyidir.

Genel olarak, olabildiğince kaçınılması gerektiği halde. İstisna türünü temel alarak belirli bir eylemde bulunmazsanız, istisnasız hareket etmemesi ve istisnanın kabarmasına izin vermek yerine istisnayı yutmak veya yanlış şekilde ele almak mümkündür.

Daha fazla okuma için bu SO cevabına bir göz atın .


1
Bu durum (bir geliştiricinin Pokemon Trainer olması gerektiği zaman) sizin için bir yazılım hazırlarken ortaya çıkıyor: katmanları, veritabanı bağlantılarını ve kullanıcının GUI'sini yaptınız. Uygulamanız, bağlantı koptu, kullanıcı klasörü silindi, veriler bozuldu vb. Durumlardan kurtarılmalıdır. Son Kullanıcılar çöküp yanan uygulamaları sevmez. Yanan patlayan bir bilgisayar üzerinde çalışabilen uygulamaları severler!
Broken_Window

Bunu şimdiye kadar düşünmemiştim, ama Pokemon'da, genellikle 'hepsini yakala' yoluyla, her birinin tam olarak birini istediğinizi ve bu ifadenin ortak kullanımının zıttı olan özel olarak onu yakalamak zorunda kalacağı varsayılıyor. programcılar arasında.
Magus,

2
@Magus: Böyle bir yöntemle LoadDocument(), yanlış olabilecek her şeyi tanımlamak aslında imkansızdır, ancak atılabilecek istisnaların% 99'u basitçe "Bir dosyanın içeriğini verilen adla yorumlamak mümkün değildi bir belge; onunla başa çık. " Birisi geçerli bir belge dosyası olmayan bir şeyi açmaya çalışırsa, bu uygulamanın çökmemesi ve diğer açık belgeleri öldürmemesi gerekir. Pokemon hata bu tür durumlarda işleme çirkin, ama iyi bir alternatif bilmiyorum.
supercat

@supercat: Sadece dilsel bir noktaya değiniyordum. Ancak, geçersiz dosya içeriğinin birden fazla istisna atması gereken bir şey olduğunu sanmıyorum.
Magus

1
@ Magus: Her türlü istisnayı ortaya çıkarabilir - sorun bu. Bir dosyadaki geçersiz verilerin bir sonucu olarak atılabilecek her türlü istisnayı önceden tahmin etmek genellikle çok zordur. Eğer biri PokeMon kullanımı kullanmıyorsa, örneğin bir dosya yüklüyken uygulamanın ölmesi riski vardır, çünkü onda bir biçimlendirilmiş 32 bit tam sayı gerektiren bir yerde son derece uzun bir rakam dizisi bulunur ve ayrıştırma mantığı.
supercat,

1

Genel istisna yakalamak kötü bir programdır çünkü programınızı tanımsız bir durumda bırakır. Nerede yanlış gittiğini bilmiyorsunuz, böylece programınızın gerçekte ne yaptığını ya da yapmadığını bilmiyorsunuz.

Bir programı kapatırken, hepsini yakalamaya izin vereceğim yer. Tamamen temizleyebildiğin sürece. Kapattığınız bir program kadar sinir bozucu olan hiçbir şey yoktur; sadece orada oturmaktan başka bir şey yapmaz, uzağa gitmez ve bilgisayarınızın kapanmasını önler.

Dağıtılmış bir ortamda log yönteminiz geri tepebilir: genel bir istisna yakalamak, programınızın hala diğer kullanıcıların günlük kaydı yapmasını engelleyen bir günlük dosyası üzerinde kilitlenebileceği anlamına gelebilir.


0

Bu kuralın gerekçesini anlıyorum. Ancak uygulamada, atılan istisnadan bağımsız olarak aynı işlemi yapmak istersem, neden her birini özel olarak ele alacağım?

Diğerlerinin de söylediği gibi, atılan istisnadan bağımsız olarak, yapmak isteyeceğiniz bir işlemi hayal etmek (imkansız değilse de) gerçekten zor. Yalnızca bir örnek, programın durumunun bozulduğu ve herhangi bir başka işlemin sorunlara yol açabileceği durumlardır (bu, gerekçeli gerekçedir Environment.FailFast).

Ayrıca, belirli istisnaları ele alırsam, aradığım kod gelecekte yeni bir istisna oluşturmak üzere değişirse ne olur? Şimdi bu yeni istisnayı ele almak için kodumu değiştirmem gerekiyor. Oysa eğer İstisna'yı basitçe yakaladıysam kodumun değişmesi gerekmiyor.

Hobi kodu için yakalamak yeterlidir Exception, ancak profesyonel sınıf kod için yeni bir istisna türü tanıtan yöntem imzasındaki bir değişiklikle aynı şekilde ele alınmalıdır, örn. Kırılma değişikliği olarak kabul edilmelidir. Bu bakış açısına abone olduysanız, hemen değişiklik yapmanın (veya doğrulamanın) müşteri kodunun tek doğru eylem şekli olduğu hemen bellidir.

Örneğin, Foo Bar'ı çağırırsa ve Foo'nun Bar tarafından atılan istisna türünden bağımsız olarak işlemeyi durdurması gerekiyorsa, yakaladığım istisna türüne özgü olmanın herhangi bir avantajı var mı?

Elbette, çünkü sadece atılan istisnaları yakalayamayacaksınız Bar. Ayrıca Bar'ın istemcilerinin hatta çalışma zamanının Barçağrı yığındaki süre boyunca atabileceği istisnalar da olacaktır . İyi yazılmışlar, Bargerektiğinde kendi istisna türlerini tanımlamalı ve böylece arayanlar kendileri tarafından yayımlanan istisnaları özel olarak yakalayabilsinler.

Peki ya OutOfMemoryException dışındaki her istisnayı yoksaymak istersem?

IMHO, istisnaların ele alınması hakkında düşünmenin yanlış yoludur. Kara listelerde değil, beyaz listelerde (A ve B istisna tiplerini yakalayın) çalışmalısınız (X dışındaki tüm istisnaları yakalayın).


Denenen bir işlemin yan etki olmadan başarısız olduğunu belirten tüm istisnalar için yapılması gereken bir eylemi belirtmek ve sistemin durumu hakkında olumsuz ima etmek genellikle mümkündür. Örneğin, bir kullanıcı yüklenmek üzere bir belge dosyası seçerse, bir program adını "bir disk dosyasından verilerle belge nesnesi oluştur" yöntemine aktarır ve bu yöntem uygulamanın beklememesi için belirli bir nedenle başarısız olur (ancak Yukarıdaki kriterleri karşılar), uygun davranış, uygulamayı çökertmek yerine "Belge yüklenemedi" mesajını görüntülemek olmalıdır.
supercat

Maalesef, bir istisnanın, müşteri kodunun bilmek isteyeceği en önemli şeyi gösterebileceği standart bir yöntem yoktur - sistemin durumu hakkında, istenen işlemi gerçekleştirememe durumunun ötesinde neyin kötü olacağı anlamına gelir. Bu nedenle, tüm istisnaların yerine getirilmesi gereken durumlar nadir olsa da, birçok istisnanın aynı şekilde ele alınması gereken birçok durum vardır ve bu tür istisnaların tamamının karşılaması gereken hiçbir kriter yoktur. farklı şekilde ele alınmalıdır.
supercat,

0

Belki . Her kuralın istisnaları vardır ve hiçbir kural eleştirel olarak izlenmemelidir. Örneğin , tüm istisnaları yutmanın mantıklı olduğu örneklerden biri olabilirsiniz . Örneğin, kritik bir üretim sistemine izleme eklemek istiyorsanız ve değişikliklerin uygulamanızın ana görevini bozmadığından kesinlikle emin olmak istiyorsanız.

Ancak , hepsini sessizce görmezden gelmeye karar vermeden önce başarısızlığın olası nedenlerini dikkatlice düşünmelisiniz. Örneğin, istisnanın nedeni şuysa:

  • Günlük tutma yönteminde her zaman belirli bir istisna atmasına neden olan bir programlama hatası
  • yapılandırma dosyasındaki günlük dosyasına giden geçersiz bir yol
  • disk dolu

Derhal bu sorunun mevcut olduğu hakkında bilgilendirilmek istemezseniz, düzeltebilirsiniz. İstisnayı yutmak, hiçbir şeyin yanlış gittiğini asla bilemeyeceğiniz anlamına gelir.

Bazı sorunlar (disk dolu gibi) uygulamanın diğer bölümlerinin de başarısız olmasına neden olabilir - ancak bu hata şimdi kaydedilmedi, bu yüzden asla bilemeyeceksiniz!


0

Bunu teknik olarak değil, mantıklı bir bakış açısıyla ele almak istiyorum.

Şimdi bu yeni istisnayı ele almak için kodumu değiştirmem gerekiyor.

Eh, biri başa çıkmak zorunda kalacak. Fikir bu. Kütüphane kodu yazarları, yeni istisna türleri eklemek konusunda ihtiyatlı olacaktır, ancak müşterileri kırması muhtemeldir, bununla çok sık karşılaşmamalısınız.

Sorunuz temelde "Neyin yanlış gittiğini umursamıyorsam? Gerçekten ne olduğunu bulma zorluğundan geçmek zorunda mıyım?"

İşte güzellik kısmı: hayır yok.

“Öyleyse, diğer tarafa bakabilir ve ne kötü bir şey çıkarsa, halının altına otomatik olarak süpürülüp bununla bitebilir miyim?”

Hayır, bu da işe yaramadı.

Mesele şu ki, olası istisnaların toplanması, her zaman beklediğiniz koleksiyondan daha büyüktür ve yerel küçük probleminiz bağlamında ilgilenir. Beklediklerinizle ilgileniyorsunuz ve beklenmeyen bir şey olursa, yutmak yerine daha üst düzey işleyicilere bırakıyorsunuz. Beklemeyeceğiniz bir istisnayı umursamıyorsanız, çağrı yığınında bulunan birisinin iddiaya gireceğini ve işleyicisine ulaşmadan önce bir istisnayı öldürmek için sabotaj olacaktır.

“Ama… ama… o zaman umursamadığım diğer istisnalardan biri görevimin başarısız olmasına neden olabilir!”

Evet. Ancak yerel olarak ele alınanlardan sonra her zaman daha önemli olacaklar. Bir yangın alarmı ya da patronun ne yaptığınızı durdurmanızı ve ortaya çıkan daha acil bir görevi almanızı söyleyen gibi.


-3

Genel istisnaları her işlemin en üst düzeyinde yakalamanız ve hatayı olabildiğince bildirerek ve işlemi sonlandırarak halletmeniz gerekir.

Genel istisnalar yakalamamalı ve uygulamaya devam etmeye çalışmalısınız.

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.