- Javaで実装されたメソッドが例外をスローした場合、e.javaExceptionにJavaの例外オブジェクトが入っている
- スクリプトエラーの場合、e.rhinoExceptionにRhinoの例外オブジェクトが入っている
- スクリプトで明示的にthrowを実行した場合、eにスローされたオブジェクトそのものが入っている
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 件のコメント:
コメントを投稿