2012-09-19

条件付きcatchで必要な例外だけ処理する

Rhinoで通常のcatchを使用すると、 ファイルがなかったことを知らせるFileNotFoundExceptionだろうと、 スクリプトの記述ミスで起きたNullPointerExceptionだろうと、 何でもcatchしてしまう。
例外をcatchした後でif文を使って内容をチェックし、 目的外の例外オブジェクトだったら再びthrowする方法もあるが、 条件付きcatchを使用することで、もっと簡潔に記述できる。

1. 実行するスクリプト(catch-if.js):
var stdout = java.lang.System.out;
var fileName = "<no file>";
try {
    new java.io.FileInputStream(fileName); // FileNotFoundException
} catch (e if e.javaException instanceof java.io.FileNotFoundException) {
    stdout.println("file not found");
}
try {
    new java.lang.Class.forName(null); // NullPointerException
} catch (e if e.javaException instanceof java.lang.ClassNotFoundException) {
    stdout.println("class not found");
} catch (e) {
    stdout.println(e);
}

2-1. Rhino1.7で実行する:
>java -classpath .;js.jar org.mozilla.javascript.tools.shell.Main -w -debug catch-if.js
file not found
JavaException: java.lang.NullPointerException: null

2-2. jrunscript(Java1.7)で実行すると、結果はRhino1.7と同じ:
>jrunscript catch-if.js
file not found
JavaException: java.lang.NullPointerException: null

0 件のコメント:

コメントを投稿