gpt4 book ai didi

c# - AppDomain.FirstChanceException 和堆栈溢出异常

转载 作者:可可西里 更新时间:2023-11-01 07:47:27 27 4
gpt4 key购买 nike

我正在使用 FirstChanceException事件记录有关任何引发的异常的详细信息。

static void Main(string[] args)
{
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
Console.WriteLine("Inside first chance exception.");
};

throw new Exception("Exception thrown in main.");
}

这按预期工作。但是,如果在事件处理程序中抛出异常,则会发生堆栈溢出,因为事件将递归引发。

static void Main(string[] args)
{
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
throw new Exception("Stackoverflow");
};

throw new Exception("Exception thrown in main.");
}

如何处理事件处理程序中发生的异常?

编辑:

有一些答案建议我将代码包装在事件处理程序中的 try/catch block 中,但这不起作用,因为事件在异常可以被处理之前引发。

static void Main(string[] args)
{
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
try
{
throw new Exception("Stackoverflow");
}
catch
{
}
};

throw new Exception("Exception thrown in main.");
}

最佳答案

这对我有用:

private volatile bool _insideFirstChanceExceptionHandler;    

// ...

AppDomain.CurrentDomain.FirstChanceException += OnFirstChanceException;

// ...

private void OnFirstChanceException(object sender, FirstChanceExceptionEventArgs args)
{
if (_insideFirstChanceExceptionHandler)
{
// Prevent recursion if an exception is thrown inside this method
return;
}

_insideFirstChanceExceptionHandler = true;
try
{
// Code which may throw an exception
}
catch
{
// You have to catch all exceptions inside this method
}
finally
{
_insideFirstChanceExceptionHandler = false;
}
}

关于c# - AppDomain.FirstChanceException 和堆栈溢出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10697100/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com