如何在Rhino中获得当前脚本名称和行号?
How can I get the current script name and line number in 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的优化级别。
我猜异常正在抛出原生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支持获取行号和其他功能:
相关文章:
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- 借助asp.net验证或java脚本对多个文本进行验证
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- Java脚本时间添加
- 不显示带有本地json文件数据的谷歌地图脚本
- JQuery添加元素需要在我的js之前再次添加JQuery脚本
- 从远程脚本获取用户IP
- 如何根据时间运行不同的脚本
- 如何将字符串值从php页面发送到java脚本页面
- 如何使用Rhino删除<脚本>标签
- 从 Rhino 脚本中访问 Java 特权操作
- 如何替换Eclipse使用的rhino脚本jar
- Rhino脚本引擎是否无法识别$符号
- 用Rhino在Java中解释JavaScript:暂停/恢复脚本
- Rhino性能和编译脚本
- 如何在Rhino中获得当前脚本名称和行号?
- Javascript Rhino + JQuery简单脚本性能问题
- Rhino:如何将Java对象传递给脚本,其中可以引用为“this”
- 获取 Rhino 中脚本的路径
- 用mozilla rhino编写Java脚本和内存管理问题