Bir dosyayı okuyup yazarak ortaya çıkacak tüm istisnaları nasıl yakalayabilirim?


105

Java'da, exceptionsistisnayı tek tek yakalamak yerine hepsini elde etmenin (yakalama) bir yolu var mı?


2
ve tüm bu belirli İstisnaları catch ile yakalayacağım (İstisna e) {} ??
Johanna

Evet. İstisna, tüm istisnaların temel sınıfı olduğundan, herhangi bir istisnayı yakalayacaktır.
jjnguy

1
@ jjnguy: iyi açıklamanız için teşekkürler.
Johanna

Yardımcı olduğuna sevindim.
jjnguy

Yanıtlar:


111

İsterseniz yöntemlerinize atma cümleleri ekleyebilirsiniz. O zaman kontrol edilen yöntemleri hemen yakalamanıza gerek kalmaz. Bu şekilde exceptionsdaha sonrasını yakalayabilirsiniz (belki diğeriyle aynı anda exceptions).

Kod şöyle görünür:

public void someMethode() throws SomeCheckedException {

    //  code

}

Daha sonra exceptionsonlarla bu yöntemle uğraşmak istemezseniz başa çıkabilirsiniz .

Tüm istisnaları yakalamak için bazı kod bloklarını atabilirsiniz: (Bu, Exceptionskendi yazdığınız anlamına da gelir )

try {

    // exceptional block of code ...

    // ...

} catch (Exception e){

    // Deal with e as you please.
    //e may be any type of exception at all.

}

Çalışmasının nedeni Exception, tüm istisnalar için temel sınıf olmasıdır. Bu nedenle, atılabilecek herhangi bir istisna bir Exception(Büyük 'E' harfidir).

Kendi istisnalarınızı işlemek istiyorsanız, catchönce genel İstisna birinden önce bir blok ekleyin .

try{    
}catch(MyOwnException me){
}catch(Exception e){
}

95

Ham bir İstisnayı yakalamanın iyi bir tarz olmadığını kabul etsem de, üstün kayıt tutma ve beklenmedik durumlarla başa çıkma yeteneği sağlayan istisnaları ele almanın yolları vardır. Olağanüstü bir durumda olduğunuz için, muhtemelen yanıt süresinden çok iyi bilgi almakla ilgileniyorsunuzdur, bu nedenle performans örneği büyük bir hit olmamalıdır.

try{
    // IO code
} catch (Exception e){
    if(e instanceof IOException){
        // handle this exception type
    } else if (e instanceof AnotherExceptionType){
        //handle this one
    } else {
        // We didn't expect this one. What could it be? Let's log it, and let it bubble up the hierarchy.
        throw e;
    }
}

Ancak, bu, GÇ'nin de Hata atabileceği gerçeğini dikkate almaz. Hatalar İstisna değildir. Hatalar, her ikisi de Throwable temel sınıfını paylaşsa da, Exceptions'dan farklı bir miras hiyerarşisi altındadır. IO, Hata atabileceğinden, Atılabilirliği yakalayacak kadar ileri gitmek isteyebilirsiniz.

try{
    // IO code
} catch (Throwable t){
    if(t instanceof Exception){
        if(t instanceof IOException){
            // handle this exception type
        } else if (t instanceof AnotherExceptionType){
            //handle this one
        } else {
            // We didn't expect this Exception. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else if (t instanceof Error){
        if(t instanceof IOError){
            // handle this Error
        } else if (t instanceof AnotherError){
            //handle different Error
        } else {
            // We didn't expect this Error. What could it be? Let's log it, and let it bubble up the hierarchy.
        }
    } else {
        // This should never be reached, unless you have subclassed Throwable for your own purposes.
        throw t;
    }
}

12
Neden birden fazla yakalama bloğu kullanmıyorsunuz?
Carl G

1
Her bir istisnayı açıkça yakalamanız gerektiğini iddia ediyorum, ancak soru açıkça bir kod bloğunun fırlatacağı her şeyi nasıl yakalayacağınızı sordu.
codethulhu

Bu fırlatılabilir şey yararlıydı.
Anshul

Aradığım çözüm buydu, istisna işleme için başka bir şeye ihtiyacım vardı. Teşekkürler
CubeJockey

Atılabilir uç gerçekten kullanışlıdır.
cherryhitech

15

Temel istisna olan 'İstisna'yı yakalayın

   try { 
         //some code
   } catch (Exception e) {
        //catches exception and all subclasses 
   }

8
Bu kodu yazarsanız, neredeyse kesinlikle çok yanlış bir şey yapıyorsunuz demektir.
George

2
@George Bunu neden söyledin?
kuchi

10
@George Mutlaka değil, çok sayıda hassas giriş parametresi olan bir şeyle uğraşırsanız ve her birinin geçerliliğini doğrulamak çok karmaşıksa, çalışma vakaları düzgün bir şekilde test edildikten sonra her tür istisnayı yakalamak gitmenin yoludur . Bu, kodu anlaşılır hale getirecek ve devasa ve potansiyel olarak ağır bir durumdan çok daha az akılcı hale getirecektir.
Johnride

2
Çoğu kodlayıcılar Ben bu yüzden bu deneyin catch parçacığını kullanarak, kendi av tablolara koymak hiçbir şey ile çalışmış aslında daha iyi farklı istisna türlerinin bir demet yakalamak ve onunla hiçbir şey yapmıyor daha
Lou Morda

1
@LouisMorda Katılmıyorum, her İstisna alt sınıfını yakalamak ve bunlara dayalı bir şey yapmamak (onları görmezden gelmek) sadece bazı özel istisnaları yakalayıp görmezden gelmekten daha kötüdür. Bazı İstisna türlerini yakalarsanız ve bilgilerle hiçbir şey yapmazsanız, bu durumlarda neyin yanlış gittiğini bilme şansınız olmaz, ancak tüm İstisna alt sınıflarını yakalarsanız, çok büyük sayıda neyin yanlış gittiğini bilme şansınız olmaz. durumların. Yığın izleri ve mesajlar gibi istisnalardan gelen bilgiler olmadan hata raporlarını nasıl ele alacağınızı düşünün.
zpon

6

Bu yakalamak için kötü bir uygulamadır İstisna çok geniş Sadece, ve bir gibi bir şey kaçırabilir - NullPointerException kendi kodunuzu.

Çoğu dosya işlemi için IOException kök istisnadır. Bunun yerine onu yakalamak daha iyi.


1
İstisna'yı yakalamak kötü bir uygulamadır. neden? olumsuz oy açıkladı
Pedro Sequeira

4

Evet var.

try
{
    //Read/write file
}catch(Exception ex)
{
    //catches all exceptions extended from Exception (which is everything)
}

4

Tek yakalama bloğunda birden fazla istisna yakalayabilirsiniz.

try{
  // somecode throwing multiple exceptions;
} catch (Exception1 | Exception2 | Exception3 exception){
  // handle exception.
} 

3

Sadece belirli İstisnaların aksine fırlatılan Exceptionherhangi bir türden herhangi birini yakalamak mı istiyorsunuz ?

Öyleyse:

try {
   //...file IO...
} catch(Exception e) {
   //...do stuff with e, such as check its type or log it...
}

Spesifik olmayanlar için ne yapmalıyım?
Johanna

ve tüm bu belirli İstisnaları catch ile yakalayacağım (İstisna e) {} ??
Johanna
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.