C# 为什么抛出的异常与catch块C不正确匹配#

C# 为什么抛出的异常与catch块C不正确匹配#,c#,exception-handling,visual-studio-debugging,C#,Exception Handling,Visual Studio Debugging,面对SocketException的一些奇怪问题。附加的截图说明了更多 为什么第一个catch块不捕获异常,而它要捕获SocketException,而抛出的异常又是SocketException 为什么控件要转到第二个catch块,该块用于捕获任何异常 [编辑]:也在调试模式下添加屏幕截图 执行没有进入第二个catch块,try catch显然不起作用,异常会被抛出调用堆栈,下面的任何catch子句都会被忽略 它看起来就是这样,因为您在发布模式下进行调试,这不是一个好主意,因为IDE可能缺少

面对SocketException的一些奇怪问题。附加的截图说明了更多

  • 为什么第一个catch块不捕获异常,而它要捕获SocketException,而抛出的异常又是SocketException

  • 为什么控件要转到第二个catch块,该块用于捕获任何异常

  • [编辑]:也在调试模式下添加屏幕截图

    执行没有进入第二个catch块,
    try catch
    显然不起作用,异常会被抛出调用堆栈,下面的任何
    catch
    子句都会被忽略

    它看起来就是这样,因为您在发布模式下进行调试,这不是一个好主意,因为IDE可能缺少重要的调试信息,因此在输入第二个
    catch
    子句时错误地显示执行停止

    请注意,在该点停止实际上毫无意义,如果执行以某种方式进入第二个
    catch
    子句,它将在
    throw
    语句处停止,而不是之前

    简而言之,真正发生的是执行在第一次抛出时停止,IDE没有正确显示它

    故事的寓意;不要在发布模式下调试。如果您正在运行VS2015,它实际上会警告您,在发布模式下的调试体验将低于标准(不确定此警告是否出现在以前的版本中)


    更新:问题似乎与在发布模式下调试无关,因为它仍然发生在调试模式下。不过,关键是调试不应该在发布模式下进行,因为这样的事情可能会发生。我会尝试清洗溶液,看看这是否解决了问题。如果没有,我不会担心,代码运行正常,只是IDE没有正确显示执行停止的位置,没什么大不了的。

    出于好奇,为什么要在发布模式下调试?@CharlesMager我的印象是,如果你重新抛出一个异常,它会在更高的级别被捕获,在同一次尝试的下一个接球区,你当然是对的,对不起,我没有发现你的突破点在哪里!编译器或抖动可能已经意识到两个捕获执行相同的任务,并优化了第一个捕获。如果(a)您在调试模式下调试,或者(b)您让他们记录不同的消息,会发生什么?在调试模式下也会发生同样的事情。添加了调试模式的屏幕截图too@Praveen107清理您的解决方案,IDE只是显示了错误的位置,但您的代码运行正常。@Praveen107另外,我知道没有对调试生成设置进行编辑?