【问题标题】:Why thrown exception is not correctly matched with catch block C#为什么抛出的异常与catch块C#不正确匹配
【发布时间】:2016-09-01 10:47:09
【问题描述】:

SocketException 遇到一些奇怪的问题。随附的屏幕截图对此进行了详细说明。

  1. 为什么第一个 catch 块没有捕获异常,而它本来是要捕获 SocketException 并且抛出的异常又是 SocketException。

  2. 为什么要控制第二个 catch 块来捕获任何异常?

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

【问题讨论】:

  • 出于好奇,为什么要在发布模式下调试?
  • @CharlesMager 我的印象是,如果您重新抛出异常,它会在更高级别被捕获,而不是被同一尝试的下一个 catch 块捕获。
  • @user1666620 你是对的,当然 - 抱歉,我没有发现你的断点在哪里!
  • 编译器或 JITter 可能已经意识到两个 catch 执行相同的工作并优化了第一个。如果 (a) 您在调试模式下进行调试,或者 (b) 您让它们记录不同的消息,会发生什么?

标签: c# exception-handling visual-studio-debugging


【解决方案1】:

执行没有进入第二个catch块,try-catch显然不是这样工作的,异常被抛出调用堆栈,任何后面的catch子句都被忽略。

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

请注意,此时停止确实没有意义,如果执行以某种方式进入第二个 catch 子句,它将在 throw 语句处停止,而不是之前。

简而言之,真正发生的事情是执行在第一个 throw 处停止并且 IDE 没有正确显示它。

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

更新:该问题似乎与 Release 模式下的调试无关,因为它仍然会在 Debug 模式下发生。不过,问题在于不应该在 Release 模式下进行调试,因为可能会发生这种时髦的事情。我会尝试清理解决方案,看看是否能解决问题。如果不是,我不会出汗,代码行为正确,只是 IDE 没有正确显示执行停止的位置,没什么大不了的。

【讨论】:

  • 在调试模式下发生同样的事情。也添加了调试模式的屏幕截图
  • @Praveen107 清理您的解决方案,IDE 只是显示错误的位置,但您的代码行为正确。
  • @Praveen107 另外,我知道没有对 Debug 构建设置进行编辑?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多