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