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

How can I get the current script name and line number in Rhino?

本文关键字:脚本 Rhino      更新时间:2023-09-26

我正在使用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的优化级别。

我猜异常正在抛出原生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();
}

…输出:

<>之前$(cygpath -w/opt/java/rhino/1.7R2/js.jar) -opt -1 test.jsh.jsorg.mozilla.javascript.WrappedException: Wrapped java.io.FileNotFoundException: foo(系统无法找到指定的文件)(test.jsh.js#4)org.mozilla.javascript.Context.throwAsScriptRuntimeEx (Context.java: 1773)org.mozilla.javascript.MemberBox.newInstance (MemberBox.java: 202)org.mozilla.javascript.NativeJavaClass.constructSpecific (NativeJavaClass.java: 281)org.mozilla.javascript.NativeJavaClass.construct (NativeJavaClass.java: 200)org.mozilla.javascript.Interpreter.interpretLoop (Interpreter.java: 3377)在脚本(test.jsh.js: 4)org.mozilla.javascript.Interpreter.interpret (Interpreter.java: 2487)org.mozilla.javascript.InterpretedFunction.call (InterpretedFunction.java: 164)org.mozilla.javascript.ContextFactory.doTopCall (ContextFactory.java: 398)org.mozilla.javascript.ScriptRuntime.doTopCall (ScriptRuntime.java: 3065)org.mozilla.javascript.InterpretedFunction.exec (InterpretedFunction.java: 175)org.mozilla.javascript.tools.shell.Main.evaluateScript (Main.java: 564)org.mozilla.javascript.tools.shell.Main.processFileSecure (Main.java: 486)org.mozilla.javascript.tools.shell.Main.processFile (Main.java: 452)org.mozilla.javascript.tools.shell.Main.processSource (Main.java: 443)org.mozilla.javascript.tools.shell.Main.processFiles (Main.java: 196)org.mozilla.javascript.tools.shell.Main IProxy.run美元(Main.java: 117)org.mozilla.javascript.Context.call (Context.java: 515)org.mozilla.javascript.ContextFactory.call (ContextFactory.java: 507)org.mozilla.javascript.tools.shell.Main.exec (Main.java: 179)org.mozilla.javascript.tools.shell.Main.main (Main.java: 157)产生原因:java.io.FileNotFoundException: foo(系统找不到指定的文件)在java.io.FileInputStream。打开(本机方法)在java.io.FileInputStream。(未知来源)在java.io.FileInputStream。(未知来源)在sun.reflect.NativeConstructorAccessorImpl。newInstance0(本地方法)在sun.reflect.NativeConstructorAccessorImpl。newInstance(未知源)在sun.reflect.DelegatingConstructorAccessorImpl。newInstance(未知源)在java.lang.reflect.Constructor。newInstance(未知源)org.mozilla.javascript.MemberBox.newInstance (MemberBox.java: 194)…18日更之前

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

为什么不为您的异常设置一些日志功能,如Log4j?这样,您就可以设置一个properties文件,这样每当您记录某些内容时,它都会以相同的方式输出(而不是总是调用Abort()函数)。此外,Log4j支持获取行号和其他功能: