java - 是否可以通过异常将内容从 Rhino 传送到 Java?

标签 java javascript rhino

使用 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/

相关文章:

javascript - NodeJS 'Can\' t 在发送后设置 header 。

javascript - 如何将javascript局部变量转换为全局变量?

java - 如何在 Java 应用程序中通过 JavaScript 启动程序?

java - Spring @ModelAttribute 接口(interface)

java - Spring引入访问原来引入的类

java - 如何确保我的 *jar 或 *class 可以在 MacOS 上运行?

javascript - AJAX 调用后 PHP 结果不显示

java - Rhino 范围垃圾何时被收集?

javascript - Wildfly 8.2 - ScriptEngineManager.getEngineFactories 在服务器启动时为空

java - 在 spring 中用 mockings 替换深层次的 Autowiring 依赖