假设我有一个应用程序,用户可以在其中提供用JavaScript编写的脚本来执行某些任务。这是使用Jint完成的。但是,编写错误的脚本会导致JintEngine.Run()
中的堆栈溢出异常,从而导致整个应用程序崩溃。我宁愿告诉用户脚本中的错误。
我试图在另一个应用程序域上运行Jint,这没有帮助,导致SOE上的AFAIK默认操作正在退出进程。可以通过使用CLR托管来改变其他任何方式吗?
我知道我可以运行单独的流程,这是我的后备,但我不想这样做。
答案 0 :(得分:7)
正如您所怀疑的那样,除非您自己托管CLR,否则捕获运行时生成的StackOverflowException是不可能的[1]。正如Microsoft文档所建议的那样,最好的办法是尝试在堆栈溢出发生之前检测它。
在使用Jint的情况下,这意味着找到一些方法来挂钩执行引擎并将自己的代码附加到任意方法调用。幸运的是,他们的文档的简要概述表明他们有一个调试模式就是这样! [2]
毫无疑问,在调试模式下运行意味着减慢脚本执行速度;由你来决定检测溢出的好处是否值得惩罚 - 我绝对建议测量这种惩罚以确保它真的会成为一个问题。一种可能的缓解措施是允许用户选择何时激活调试模式。
-Mark
[1] http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx(见备注)
[2] http://jint.codeplex.com/wikipage?title=Debugging&referringTitle=Documentation