安全处理异常时避免第一次机会异常消息

CVe*_*tex 75 .net c# exception

以下代码捕获EOS异常

using (var reader = new BinaryReader(httpRequestBodyStream)) {

    try {
        while (true) {
            bodyByteList.Add(reader.ReadByte());
        }
    } catch (EndOfStreamException) { }
}
Run Code Online (Sandbox Code Playgroud)

那么为什么我的控制台仍然会收到第一次机会异常?

mscorlib.dll中发生了'System.IO.EndOfStreamException'类型的第一次机会异常

有没有办法隐藏这些第一次机会异常消息?

And*_*lla 190

要避免看到消息,请右键单击输出窗口并取消选中"异常消息".

但是,如果您想知道何时抛出异常而不设置断点并重新配置调试器,那么看到它们发生可能会很好.


Bra*_*son 79

"第一次机会"异常的要点是你看到它们是预处理程序,这样你就可以在抛出时调试它们."第二次机会"异常是没有适当处理程序的异常.有时候你想要抓住"第一次偶然"的例外情况,因为重要的是要看看当它被抛出时发生了什么,即使有人正在捕捉它.

没有什么可担心的.这是正常行为.

  • 实际上,它没有什么可担心的,但它们会使调试输出日志混乱:( (57认同)

Ale*_*eby 19

1)在Visual Studio中,您可以更改调试器处理(中断)异常的方式的设置.

转到"调试">"例外".(请注意,这可能不在您的菜单中,具体取决于您的Visual Studio环境设置.如果不是仅使用"自定义"菜单将其添加到菜单中.)

在那里,您将看到一个异常对话框,以及何时打破它们.

在"公共语言运行时异常"行中,您可以取消选择抛出(这应该会让您不必担心第一次机会异常),如果您愿意,也可以取消选择User-unhandeled(我不建议).

2)您获得的消息不应该在控制台中,而应该出现在Visual Studio的"输出"窗口中.如果是后一种情况,那么我没有找到删除它的可能性,但是如果你在没有Visual Studio的情况下运行应用程序就不会出现.

希望有所帮助.


lou*_*dej 11

与Java不同,.NET处理能力方面的异常相当昂贵,在正常和成功的执行路径中应避免处理异常.

您不仅可以避免在控制台窗口中出现混乱,而且还可以提高性能,并且可以使.NET CLR Exceptions等性能计数器更有意义.

在这个例子中你会使用

while (reader.PeekChar() != -1)
{
    bodyByteList.Add(reader.ReadByte());
}
Run Code Online (Sandbox Code Playgroud)

  • 当然可以."有没有办法隐藏这些第一次机会异常消息?" - 这个循环不会出现第一次机会异常.:) (9认同)
  • 不回答这个问题 (4认同)

小智 7

我有这个问题,无法弄清楚抛出异常的位置.所以我的解决方案是让Visual Studio停止在这种异常上执行.

  1. 导航到"调试/例外"
  2. 展开"公共语言运行时异常"树.
  3. 展开"系统"分支.
  4. 向下滚动到"NullReferenceException"的位置,然后选中"throw"复选框,并取消选中"user-processed".
  5. 调试您的项目.


Vot*_*fee 5

如果您想更好地控制这些消息,您可以添加一个处理程序:

Friend Sub AddTheHandler()
AddHandler AppDomain.CurrentDomain.FirstChanceException, AddressOf FirstChanceExceptionHandler
End Sub

<Conditional("DEBUG")>
Friend Sub FirstChanceExceptionHandler( source As Object,  e As Runtime.ExceptionServices.FirstChanceExceptionEventArgs)
' Process first chance exception

End Sub
Run Code Online (Sandbox Code Playgroud)

这允许您像其他评论中提到的那样让它们保持沉默,但仍然确保您能够意识到它们。我发现如果我将消息和时间戳记录到文本文件中,那么很高兴看到我真正抛出了多少个消息。