2012年3月26日月曜日

[Java7][新機能]Multi-catch

そんなわけで長らくご無沙汰しておりました。
Java7記事も書かずに何をしてたのかと言うと、Apple信者へと
成り代わる儀式に没頭しておりました・・・・

お陰様でMBP 15インチモデル、New iPad、SIMフリー版iPhoneと
あれよあれよという間に身の回りがApple製品に統一されまして
いろいろと快適になってきております。
むしろこの環境作る迄にしたことをブログネタにするべきなのではと
思う今日この頃ですが、そうすると本末転倒ですのでまずは本来の
目的であるJava7ネタをぼちぼちと書きたいと思います。




今回はMulti-catchについて。
おそらくこれはサンプルソースを見てもらった方が早そうなので
まずはこちらを。


public class MultiCatch {
public static void main(String[] args) {
try {
// ここから
InetAddress address = InetAddress.getByName("127.0.0.1");
InetSocketAddress socketAddress = new InetSocketAddress(address, 8000);
Socket socket = new Socket();
socket.bind(socketAddress);
// ここまでがIOExceptionが発生する可能性ありな箇所
// ここから
Thread.sleep(1000);
// ここまでがInterruptedExceptionが発生する可能性ありな箇所
} catch (IOException | InterruptedException e) {
// こんな感じにExceptionをまとめてcatch可能
}
}
}

これでいちいち発生する分のExceptionを別々にcatchする必要がなくて
ソースがきれいにまとまっていい感じ!



とは、正直思いませんでした・・・。
大体この様なケースの場合、ちゃんと例外ハンドリングやらログ出力をして
障害切り分けを意識したソースであれば、こんな感じになってるはず。

public class MultiCatch {
    public static void main(String[] args) {
        try {
            // ここから
            InetAddress address = InetAddress.getByName("127.0.0.1");
            InetSocketAddress socketAddress = new InetSocketAddress(address, 8000);
            Socket socket = new Socket();
            socket.bind(socketAddress);
            // ここまでがIOExceptionが発生する可能性ありな箇所
           
            // ここから
            Thread.sleep(1000);
            // ここまでがInterruptedExceptionが発生する可能性ありな箇所
           
        } catch (IOException ioe) {
            // ソケットのバインドに失敗しました的なログを出力
        } catch (InterruptedException ie) {
            // スレッドのスリープ中に割り込みが発生しました的なログ出力
        }
    }
}

この例はそんなに良くないですが、この様な感じで
発生した例外を解析しやすい様にそれぞれの事象を説明する様な
ログを出力するはずです。
Multi-catchでまとめてしまうと、catch句の中でif文でinstanceofとか使って
Exceptionを判別するとかという形になっちゃいそうです。

というわけで、個人的にはあまり使うことがない機能かなと
正直思いました。
 

0 件のコメント:

コメントを投稿