Rhino は例外のサポートが不十分であり、Groovy や JRuby などの他のスクリプト エンジンほど有用ではなく、有用でもありません。
問題のデバッグを支援するために、このトリックを使用できると思います。Rhino は、エラーに関するいくつかの情報を出力するためにアクセスできるエラー オブジェクトに非標準のプロパティを追加します。
try {
someCode()
}
catch(e) {
if(e.rhinoException != null)
{
e.rhinoException.printStackTrace();
}
}
バインディングを使用して、何か問題が発生したことを示すこともできますか?
私はあなたが今探しているものを理解しています。見栄えは悪く、実際にはひどいものですが、基になる JavaScriptException にアクセスして、例外をスローした場所の値を取得できます。
package test;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import sun.org.mozilla.javascript.*;
public class Main {
private static ScriptEngineManager mgr = new ScriptEngineManager();
private static ScriptEngine engine = mgr.getEngineByName("JavaScript");
public static void main(String... args) {
System.out.println("START");
try {
engine.eval("throw { error: \"cheese\", context: \"payload\" };");
} catch (ScriptException e) {
JavaScriptException jse = (JavaScriptException)e.getCause();
Object obj = jse.getValue();
ScriptableObject so = (ScriptableObject)obj;
System.out.println(so.get("error", so));
System.out.println(so.get("context", so));
}
System.out.println("END");
}
}