使用 JDK 6 ScriptEngine
机制,在“eval”或“invokeMethod”期间出现的任何错误或导致 ScriptException
的任何错误都将返回给调用 Java环境。据我通过实验和源代码阅读所知道的,当我的 Javascript 代码想要抛出异常时,我能做的最好的从 Javascript 获取信息的方法是抛出一个字符串。该字符串显示在 ScriptException
对象的“getMessage”返回值中。不漂亮。
似乎能够:
if (somethingWrong) {
throw { error: Errors.INVALID_SOMETHING, context: whatever() };
}
来自 Javascript,然后 Java 代码可以以某种方式获取该对象。然而,我担心考虑到 Rhino ScriptEngine
包装器的当前实现,这是不可能的。但是,如果有人知道一个确实有效的技巧,我很乐意看到它。
最佳答案
Rhino 对异常的支持确实很差,它们不像在其他脚本引擎(如 Groovy 或 JRuby)中那样有用或有用。
为了帮助您调试问题,我认为您可以使用这个技巧。 Rhino 向 Error 对象添加了一个非标准属性,您可以访问该属性以打印出有关错误的一些信息。
try {
someCode()
}
catch(e) {
if(e.rhinoException != null)
{
e.rhinoException.printStackTrace();
}
}
您还可以使用绑定(bind)来指示出现问题吗?
我明白你现在在找什么了。它并不漂亮,事实上它很糟糕,但您可以访问底层的 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");
}
}
关于java - 是否可以通过异常将内容从 Rhino 传送到 Java?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3180593/