Java における例外処理の注意点

例えば以下のようなプログラムを実行する場合を考えます。

public void method2(String urlStr) throws Exception{
    InputStream input = null;
    try{
        URL url = new URL(urlStr);
        input = url.openStream();
        int len=0;
        byte buf[] = new byte[1024];
        while( (len = input.read(buf)) > 0 ){
            System.out.println(new String(buf));
        }
    }finally{
        input.close();
    }
}

public void method1(String urlStr){
    try{
        method2(urlStr);
    }catch(Exception e){
        e.printStackTrace();
    }
}

上記のプログラムで例外が発生した場合、発生した場所を特定するのは簡単でしょうか。

このプログラムの場合はmethod1から呼び出しているのはmethod2だけなのでそれほど難しくはありませんが、より長いプログラムではもっと難しくなります。

ここで問題なのは、method2で例外を無条件にmethod1に投げ返していることです。throwsやcatchでExceptionを指定することは予期しない例外に対応しきれないことにつながるので、throwsやcatchで指定する例外は限定するべきです(ここではIOException、MalformedURLException)。

Findbugsなどでバグの検索を行った場合は警告が現れますが、普段のコーディングでは気づきにくいところです。