StackOverflowException

StackOverflowException

如何捕获StackOverflowException

我有一个允许用户编写脚本的程序,当运行任意用户代码时,我可能会得到StackOverflowException。运行用户代码的片段显然被try-catch包围,但是在正常情况下堆栈溢出是无法捕获的。

我环顾四周,this是我能找到的最有用的答案,但仍然使我陷入僵局。从article in the BCL team's blog中,我发现我应该使用RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup来调用代码和即使在堆栈溢出后也将被调用的委托(delegate),但是尝试时,该过程将被堆栈溢出消息终止,而不会再调用该委托(delegate)。我试过在处理程序方法上添加PrePrepareMethodAttribute,但没有任何改变。

我也尝试过使用AppDomain并处理UnhandledExceptionDomainUnload事件-但整个过程在堆栈溢出时被杀死。即使我手动throw new StackOverflowException();并没有得到实际的堆栈溢出,也会发生相同的情况。

最佳答案

要处理代码未处理的异常,可以订阅AppDomains UnhandledException -操作系统在显示表示程序意外退出的对话框时将对其进行处理。

在程序的Main方法中使用



然后向事件添加处理程序



在处理程序中,您可以执行所需的任何操作,例如日志,显示错误,甚至根据需要重新初始化程序。

10-08 11:54