【发布时间】:2010-08-30 02:24:26
【问题描述】:
如何捕捉StackOverflowException?
我有一个允许用户编写脚本的程序,当运行任意用户代码时,我可能会得到一个StackOverflowException。运行用户代码的那块明显被try-catch包围了,但是一般情况下栈溢出是无法捕获的。
我环顾四周,this 是我能找到的最有用的答案,但仍然让我陷入了死胡同;从article in the BCL team's blog 我发现我应该使用RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup 调用代码和即使在堆栈溢出后也会被调用的委托,但是在尝试时,进程会因堆栈溢出消息而终止,而不会调用委托.我尝试在处理程序方法上添加PrePrepareMethodAttribute,但这并没有改变任何东西。
我也尝试过使用 AppDomain 并同时处理 UnhandledException 和 DomainUnload 事件 - 但整个进程在堆栈溢出时被终止。即使我手动 throw new StackOverflowException(); 并且没有得到实际的堆栈溢出,也会发生同样的情况。
【问题讨论】:
-
您是否有可以使用脚本自动执行某些任意过程的程序,或者您的程序是脚本的文本编辑器?您的“任意用户代码”本身是脚本还是某种 IL 插件?
-
现在我的程序是该语言的 REPL(读取-评估-打印循环)。
标签: c# stack-overflow