在我的代码中,所有脚本都包含在.js文件中。每当其中一个脚本包含错误时,我就明白了:
javax.script.ScriptException:sun.org.mozilla.javascript.internal.EcmaError:ReferenceError:未定义“nonexistant”。 <未知来源>中的(<未知来源>#5)在第5行
我的错误是< Unknown Source>。多个文件在一个ScriptContext中,并且很难找到错误。它看起来也很可怕。
有没有办法替换< Unknown Source>用实际的文件名?我看到的所有方法都没有支持传递File对象,所以我真的很困惑。
答案 0 :(得分:9)
使用ScriptEngine.FILENAME常量:
scriptEngine.put(ScriptEngine.FILENAME,scriptFile.toString());
答案 1 :(得分:6)
这个问题还没有被特别提出,但我想我会向未来发现这个话题的人提供这个:当Java 8发布时我们会从Rhino转移到Nashorn作为基础JavaScript引擎。在Nashorn下,文件名应用于ScriptContext,而不是ScriptEngine本身:
ScriptContext context = new SimpleScriptContext();
context.setAttribute(ScriptEngine.FILENAME, "test.js", ScriptContext.ENGINE_SCOPE);
try
{
engine.eval(script, context);
}
catch (ScriptException e)
{
/* e.getFileName() will return "test.js" */
}
如果您尝试使用ScriptEngine.put()来应用文件名,就像在Rhino下一样,不会发生任何事情,您的异常将返回“< eval>”作为文件名。
我想在未来几个月会有一些人遇到这个问题,所以我想我会提供它。这似乎没有在任何地方记录。我不得不深入研究Nashorn的源代码来解决它。
答案 2 :(得分:3)
通过由mattj65816设计的ScriptContext设置脚本引擎文件名的Java 8(Nashorn)方式也适用于Rhino引擎。所以,我建议只使用
context.setAttribute(ScriptEngine.FILENAME, "test.js", ScriptContext.ENGINE_SCOPE);
因为这段代码适用于两种常见的JavaScript引擎。您不需要创建自己的上下文,但只将属性设置为引擎的默认上下文:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
if (engine != null) {
ScriptContext ctx = engine.getContext();
ctx.setAttribute(ScriptEngine.FILENAME, "test.js", ScriptContext.ENGINE_SCOPE);
...
}
答案 3 :(得分:0)
完美!
ScriptEngine engine = new ScriptEngineManager().getEngineByExtension("js");
// javax.script.filename
engine.put(ScriptEngine.FILENAME, "test1.js");
try {
engine.eval("function throwError1(){throw new Error('test, haha')}");
} catch (ScriptException e) {
}
engine.put(ScriptEngine.FILENAME, "test2.js");
try {
engine.eval("function throwError2(){throw new Error('test2, haha')}");
} catch (ScriptException e) {
}
try {
engine.eval("throwError1()");
} catch (ScriptException e) {
System.out.println(e.getMessage());
}
try {
engine.eval("throwError2()");
} catch (ScriptException e) {
System.out.println(e.getMessage());
}
输出:
Error: test, haha in test1.js at line number 1
Error: test2, haha in test2.js at line number 1