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

C# 懒惰<;T>;处理异常时中断,c#,C#,也许我遗漏了一些东西,但为什么VisualStudio中断执行,告诉我发生了异常,即使它已被处理 是的,取消选中user unhandled exception(用户未处理异常)可以解决问题,但为什么已处理异常会被称为unhandled exception(未处理异常) Lazy<int> lazyCount = new Lazy<int>(() => { throw new NotImplementedException(); }, System.Threadin

也许我遗漏了一些东西,但为什么VisualStudio中断执行,告诉我发生了异常,即使它已被处理

是的,取消选中user unhandled exception(用户未处理异常)可以解决问题,但为什么已处理异常会被称为unhandled exception(未处理异常)

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();
Lazy lazyCount=new Lazy(()=>{throw new NotImplementedException();},System.Threading.LazyThreadSafetyMode.None);
Func valueGenerator=()=>{抛出新的NotImplementedException();};
尝试
{
int value=lazyCount.value;
}
捕获(未实现异常e)
{
控制台。写入线(“中断”);
}
尝试
{
int value=valueGenerator();
}
捕获(未实现异常e)
{
Console.WriteLine(“不中断”);
}
尝试
{
抛出新的NotImplementedException();
}
捕获(未实现异常e)
{
Console.WriteLine(“不中断”);
}
Console.ReadLine();

调试器试图帮助您,并在异常源处提前停止。通过按ctrl+F5,而不是按F5,可以始终在调试器外部运行它


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

调试器正试图帮助您并在异常源处提前停止。通过按ctrl+F5,而不是按F5,可以始终在调试器外部运行它


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

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

工具->选项->调试

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


您可以转到
Debug->Exception…
(也可以使用Ctrl+Alt+E),单击
Find
并取消选中抛出的异常。

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

工具->选项->调试

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

您可以转到
Debug->Exception…
(也可以使用Ctrl+Alt+E),单击
查找
,然后取消选中抛出的异常。

如果执行此操作:

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

        try
        {
            //int value = lazyCount.Value;
            a();
        }
        catch (NotImplementedException e)
        {
        }
Func a=()=>{throw new NotImplementedException();};
尝试
{
//int value=lazyCount.value;
a();
}
捕获(未实现异常e)
{
}
您会注意到,它不会破坏调试器,即使您仍在调用匿名方法

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

如果您这样做:

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

        try
        {
            //int value = lazyCount.Value;
            a();
        }
        catch (NotImplementedException e)
        {
        }
Func a=()=>{throw new NotImplementedException();};
尝试
{
//int value=lazyCount.value;
a();
}
捕获(未实现异常e)
{
}
您会注意到,它不会破坏调试器,即使您仍在调用匿名方法


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

我不明白,你说的中断是什么意思?调试器/IDE是否崩溃?是否未捕获异常?@BoldClock Break as in中断执行以告诉我发生了异常。我认为这是一个正确的术语。在第一种情况下,异常没有在抛出的方法(委托)中处理。在这里,Lazy的实现遇到了障碍。异常是在不是您的代码的代码中引发的。从异常的StackTrace属性很容易看出,您没有编写b_0()方法。我不明白,您所说的中断是什么意思?调试器/IDE是否崩溃?是否未捕获异常?@BoldClock Break as in中断执行以告诉我发生了异常。我认为这是一个正确的术语。在第一种情况下,异常没有在抛出的方法(委托)中处理。在这里,Lazy的实现遇到了障碍。异常是在不是您的代码的代码中引发的。从异常的StackTrace属性很容易看出,您没有编写b_0()方法。我意识到我可以在没有调试器的情况下运行,而且很好,但我宁愿使用调试器来调试代码,而不必在每次惰性异常初始化其值时都恢复执行。我已经查看了调试->异常,没有什么能解决这个问题。是的,在该菜单中,您可以取消选中CLR异常的“抛出时中断”。我意识到我可以在没有调试器的情况下运行,并且很好,但我宁愿使用调试器来调试我的代码,而不必在每次惰性异常初始化其值时都恢复执行。我已经看过调试->异常,没有什么能解决这个问题。是的,在那个菜单中你可以