懒惰<;T>;在处理异常时中断

本文关键字:异常 中断 处理 gt lt 懒惰 | 更新日期: 2023-09-27 17:58:10

也许我遗漏了什么,但为什么visual studio会中断执行,告诉我发生了异常,尽管它已经处理了?

是的,取消选中用户未处理的异常可以解决问题,但为什么已处理的异常被称为未处理的例外?

Lazy<int> lazyCount = new Lazy<int>(() => { throw new NotImplementedException(); }, System.Threading.LazyThreadSafetyMode.None);
Func<int> valueGenerator = () => { throw new NotImplementedException(); };
try
{
    int value = lazyCount.Value;
}
catch (NotImplementedException e)
{
    Console.WriteLine("Breaks");
}
try
{
    int value = valueGenerator();
}
catch (NotImplementedException e)
{
    Console.WriteLine("Doesn't Breaks");
}
try
{
    throw new NotImplementedException();
}
catch (NotImplementedException e)
{
    Console.WriteLine("Doesn't break");
}
Console.ReadLine();

懒惰<;T>;在处理异常时中断

如果您对对话框感到恼火,我建议禁用异常助手(我不确定它有什么帮助)。

工具->选项->调试

在此选项菜单下,您可以禁用异常助手,并控制各种其他调试功能(仅我的代码等)。

正如@Michael Kennedy所指出的,您可以转到Debug -> Exception...(也可以转到Ctrl+Alt+E出以查找有问题的异常。

调试器正试图帮助您,并在异常源处提前停止。您总是可以在调试器之外运行它,方法是按ctrl+F5,而不是按F5来运行它。

要获得更多粒度,请查看Visual Studio中的"调试"->"异常"菜单。

如果这样做:

        Func<int> a = () => { throw new NotImplementedException(); };
        try
        {
            //int value = lazyCount.Value;
            a();
        }
        catch (NotImplementedException e)
        {
        }

您会注意到,即使您仍在调用匿名方法,它也不会破坏调试器。

这里发生的是LazyThreadSafetyMode。ExecutionAndPublication指示Lazy类缓存Exception,以便来自不同线程的多个对Value的调用将引发相同的异常。我的猜测是,它们有一些额外的逻辑,可以在第一次抛出异常时告诉调试器该异常是未处理的,这样您就有机会在缓存异常并稍后重新抛出之前在其原始上下文中检查该异常。我本来打算打开Reflector中的代码,看看是否是这样,但显然Reflector的免费社区版本不再是免费的。