java - 如何在 Rhino 中获取当前脚本名称和行号?

标签 java javascript exception applet rhino

我正在使用 Java 和 Mozilla Rhino 创建游戏引擎,我希望所有错误都调用一个函数并为其提供错误消息,例如

...
} catch(Exception e) {
    Abort(e);
}
...
public void Abort(str) {
    System.out.println("Script error in "current_script_name+" line: "+line_number\n\n"+e);
}

这对 RhinoException 来说很容易,但我想对其他人也有同样的事情,比如 IOException。

最佳答案

这在一定程度上取决于异常是如何被抛出的,所以我需要猜测一下。这取决于您用于执行 Rhino 的优化级别。

我猜测异常是从 native Java 代码中抛出的(即,您没有使用 throw new Packages.java.io.IOException("..."))。在这种情况下,您可以使用 printStackTrace() 来解决。这是一个可以在 Rhino shell 中运行的小脚本(名为 test.jsh.js,您将在堆栈跟踪中看到它):

try {
    //  foo does not exist
    var stream = new Packages.java.io.FileInputStream("foo");
} catch (e) {
    e.rhinoException.printStackTrace();
}

...及其输出:

$ java -jar $(cygpath -w /opt/java/rhino/1.7R2/js.jar) -opt -1 test.jsh.js
org.mozilla.javascript.WrappedException: Wrapped java.io.FileNotFoundException: foo (The system cannot find the file specified) (test.jsh.js#4)
        at org.mozilla.javascript.Context.throwAsScriptRuntimeEx(Context.java:1773)
        at org.mozilla.javascript.MemberBox.newInstance(MemberBox.java:202)
        at org.mozilla.javascript.NativeJavaClass.constructSpecific(NativeJavaClass.java:281)
        at org.mozilla.javascript.NativeJavaClass.construct(NativeJavaClass.java:200)
        at org.mozilla.javascript.Interpreter.interpretLoop(Interpreter.java:3377)
        at script(test.jsh.js:4)
        at org.mozilla.javascript.Interpreter.interpret(Interpreter.java:2487)
        at org.mozilla.javascript.InterpretedFunction.call(InterpretedFunction.java:164)
        at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:398)
        at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3065)
        at org.mozilla.javascript.InterpretedFunction.exec(InterpretedFunction.java:175)
        at org.mozilla.javascript.tools.shell.Main.evaluateScript(Main.java:564)
        at org.mozilla.javascript.tools.shell.Main.processFileSecure(Main.java:486)
        at org.mozilla.javascript.tools.shell.Main.processFile(Main.java:452)
        at org.mozilla.javascript.tools.shell.Main.processSource(Main.java:443)
        at org.mozilla.javascript.tools.shell.Main.processFiles(Main.java:196)
        at org.mozilla.javascript.tools.shell.Main$IProxy.run(Main.java:117)
        at org.mozilla.javascript.Context.call(Context.java:515)
        at org.mozilla.javascript.ContextFactory.call(ContextFactory.java:507)
        at org.mozilla.javascript.tools.shell.Main.exec(Main.java:179)
        at org.mozilla.javascript.tools.shell.Main.main(Main.java:157)
Caused by: java.io.FileNotFoundException: foo (The system cannot find the file specified)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.(Unknown Source)
        at java.io.FileInputStream.(Unknown Source)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
        at java.lang.reflect.Constructor.newInstance(Unknown Source)
        at org.mozilla.javascript.MemberBox.newInstance(MemberBox.java:194)
        ... 18 more

如果您真的想完全使用上面的 Abort() 函数,您可以从上面的堆栈跟踪中解析出适当的行;或者,您可以显示整个堆栈跟踪,这可能更有帮助,具体取决于您想要做什么。

关于java - 如何在 Rhino 中获取当前脚本名称和行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7103152/

相关文章:

javascript - 文本/javascript 与应用程序/javascript

python - 当我捕捉到异常时,如何获取上一帧的类型、文件和行号?

Java初学者: Why Does char Use ' ' Instead of ""?

java - 如何从 Midlet 运行 java 应用程序

java - 有没有办法使用gradle从文件夹解压缩多个文件?

javascript - 打开一个新窗口创建一个新 session

java - jdbcTemplate.update 用于自动递增和唯一 ID 字段

javascript - post params 没有存储在 Mongodb 中

c# - NUnit 的 ExpectedExceptionAttribute 是测试是否引发异常的唯一方法吗?

java - Autowiring :expected at least 1 bean which qualifies as autowire candidate for this dependency