假设我有一个应用程序,用户可以在其中提供用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# – 防止崩溃进程发生堆栈溢出异常
- c# 模拟线性回归的示例 2023-03-14
- C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16
- .NET CORE DI 依赖注入 2023-09-27
- WPF使用DrawingContext实现绘制刻度条 2023-07-04
- 如何使用C# 捕获进程输出 2023-03-10
- Unity Shader实现模糊效果 2023-04-27
- Oracle中for循环的使用方法 2023-07-04
- 在C# 8中如何使用默认接口方法详解 2023-03-29
- Unity3D实现渐变颜色效果 2023-01-16
- user32.dll 函数说明小结 2022-12-26