处理异常时Lazy <t>中断</t>

时间:2011-05-31 22:01:16

标签: c#

也许我错过了一些东西,但是为什么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();

3 个答案:

答案 0 :(得分:3)

调试器正试图帮助您及早停止异常源。你总是可以在调试器之外运行它,按 ctrl + F5 而不是 F5 来使它运行。

要获得更多粒度,请查看Visual Studio中的Debug-&gt; Exceptions菜单。

答案 1 :(得分:3)

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

  

工具 - &gt;选项 - &gt;调试

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

As @Michael Kennedy noted你可以转到Debug -> Exception...(也 Ctrl + Alt + E ),点击{{1并取消选中 Thrown 以查找违规异常。

答案 2 :(得分:1)

如果你这样做:

        Func<int> a = () => { throw new NotImplementedException(); };

        try
        {
            //int value = lazyCount.Value;
            a();
        }
        catch (NotImplementedException e)
        {
        }

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

这里发生的是LazyThreadSafetyMode.ExecutionAndPublication指示Lazy类缓存Exception,以便从不同线程对Value的多次调用将抛出相同的异常。我的猜测是他们有一些额外的逻辑告诉调试器第一次抛出异常是未处理的,这样你就有机会在缓存之后检查异常,然后再重新抛出。我打算在Reflector中打开代码,看看是否是这种情况,但显然Reflector的免费社区版本不再是免费的。