3

JDK 6ScriptEngineメカニズムを使用すると、「eval」または「invokeMethod」中に問題が発生したりScriptException、呼び出し元の Java 環境にスローされる結果が生じたりします。実験とソース コードの読み取りによってわかった限りでは、 Javascript コードが例外をスローしたいときにJavascript から情報を取得するためにできる最善の方法は、文字列をスローすることです。その文字列は、オブジェクトからの「getMessage」戻り値に表示されScriptExceptionます。かわいくない。

次のことができるといいようです。

 if (somethingWrong) {
   throw { error: Errors.INVALID_SOMETHING, context: whatever() };
 }

Javascriptから、そしてJavaコードは何とかそのオブジェクトに到達することができました. しかし、RhinoScriptEngineラッパーの現在の実装を考えると、それは不可能だと思います。ただし、機能するトリックを誰かが知っている場合は、ぜひ見てみたい.

4

3 に答える 3

2

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");
    }
}
于 2010-08-14T11:22:32.777 に答える
0

FWIW、Java例外オブジェクトをスローして、それをスタックに伝播させることができれば、それも非常に役立つと思います。たとえば、上記のコードを適応させるには:

try {
    engine.eval("throw new java.lang.IllegalArgumentException( 'no cookie!' )" );
} 
catch (ScriptException e) {
    Throwable cause = e.getCause();
    if ( cause != null && cause instanceof IllegalArgumentException ) {
        // ...react explicitly 
    }
    else {
        // ...react generically
    }
于 2010-12-23T17:03:25.437 に答える
0

エラー オブジェクトを JSON 文字列としてシリアル化し、Java で逆シリアル化できます。

于 2010-08-14T08:58:35.820 に答える