c# – 防止崩溃进程发生堆栈溢出异常

假设我有一个应用程序,用户可以在其中提供用JavaScript编写的脚本来执行某些任务.这是使用Jint完成的.但是,编写错误的脚本会导致JintEngine.Run()中的Stack Overflow异常,从而导致整个应用程序崩溃.我宁愿告诉用户脚...

假设我有一个应用程序,用户可以在其中提供用JavaScript编写的脚本来执行某些任务.这是使用Jint完成的.但是,编写错误的脚本会导致JintEngine.Run()中的Stack Overflow异常,从而导致整个应用程序崩溃.我宁愿告诉用户脚本中的错误.

我试图在另一个应用程序域上运行Jint,这没有帮助,导致SOE上的AFAIK默认操作正在退出进程.可以通过使用CLR托管来改变任何其他方式吗?

我知道我可以运行单独的流程,这是我的后备,但我不想这样做.

最佳答案:

正如您所怀疑的那样,除非您自己托管CLR,否则捕获运行时生成的StackOverflowException是不可能的[1].正如Microsoft文档所示,最好的办法是尝试在堆栈溢出发生之前检测它.

在使用Jint的情况下,这意味着找到一些方法来挂钩执行引擎并将您自己的代码附加到任意方法调用.幸运的是,他们的文档的简要概述表明他们有一个调试模式就是这样! [2]

毫无疑问,在调试模式下运行意味着减慢脚本执行速度;由你来决定检测溢出的好处是否值得惩罚 – 我肯定建议测量这个惩罚以确保它真的会成为一个问题.一种可能的缓解方法是允许用户选择何时调试模式处于活动状态.

-标记

[1] http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx(见备注)

[2] http://jint.codeplex.com/wikipage?title=Debugging&referringTitle=Documentation

本文标题为:c# – 防止崩溃进程发生堆栈溢出异常

基础教程推荐