2012-09-19

Rhinoでcatchした例外の種類を調べる

"catch (e)"した場合、スローされたオブジェクトがそのままeに設定されると思っていたのだが、 もう少し複雑だった。
  1. Javaで実装されたメソッドが例外をスローした場合、e.javaExceptionにJavaの例外オブジェクトが入っている
  2. スクリプトエラーの場合、e.rhinoExceptionにRhinoの例外オブジェクトが入っている
  3. スクリプトで明示的にthrowを実行した場合、eにスローされたオブジェクトそのものが入っている
1. 実行するスクリプト(exception-type.js):
var stdout = java.lang.System.out;
function catchAndDumpException(func) {
    try {
        func();
    } catch (e) {
        if (e.javaException) {
            stdout.println("e.javaException=" + e.javaException);
        } else if (e.rhinoException) {
            stdout.println("e.rhinoException=" + e.rhinoException);
        } else {
            stdout.println("e=" + e);
        }
    }
}
catchAndDumpException(function() {
    java.lang.Class.forName("UNKNOWN-CLASS"); // ClassNotFoundException
});
catchAndDumpException(function() {
    undefined.name; // EcmaError
});
catchAndDumpException(function() {
    throw new java.lang.IllegalArgumentException("Message");
});
catchAndDumpException(function() {
    throw "Error";
});

2-1. Rhino1.7で実行する:
>java -classpath .;js.jar org.mozilla.javascript.tools.shell.Main -w -debug exception-type.js
e.javaException=java.lang.ClassNotFoundException: UNKNOWN-CLASS
e.rhinoException=org.mozilla.javascript.EcmaError: TypeError: Cannot read property "name" from undefined (exception-type.js#22)
e=java.lang.IllegalArgumentException: Message
e=Error

2-2. jrunscript(Java1.7)で実行すると、結果はRhino1.7とほぼ同じ:
>jrunscript exception-type.js
e.javaException=java.lang.ClassNotFoundException: UNKNOWN-CLASS
e.rhinoException=sun.org.mozilla.javascript.internal.EcmaError: TypeError: Cannot read property "name" from undefined (exception-type.js#22)
e=java.lang.IllegalArgumentException: Message
e=Error

0 件のコメント:

コメントを投稿