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