首页 文章

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

提问于
浏览
75

以下代码捕获EOS异常

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

    try {
        while (true) {
            bodyByteList.Add(reader.ReadByte());
        }
    } catch (EndOfStreamException) { }
}

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

mscorlib.dll中出现'System.IO.EndOfStreamException'类型的第一次机会异常

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

9 回答

  • 2

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

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

  • -4

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

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

  • 78

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

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

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

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

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

    希望有所帮助 .

  • 189

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

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

    在这个例子中你会使用

    while (reader.PeekChar() != -1)
    {
        bodyByteList.Add(reader.ReadByte());
    }
    
  • 19

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

    • 导航至"Debug/Exceptions"

    • 展开"Common Language Runtime Exceptions"树 .

    • 展开"System"分支 .

    • 向下滚动到"NullReferenceException"所在的位置,然后选中"throw"复选框,并取消选中"user-handled" .

    • 调试您的项目 .

  • 11

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

    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
    

    这可以让你像其他评论中提到的那样使它们静音,但仍然可以确保你能够意识到它们 . 如果我将消息和时间戳记录到文本文件中,我发现很高兴看到我真正投掷了多少 .

  • -1

    实际上,如果每秒有很多异常,你可以通过检查reader.EndOfStream-value来实现更好的性能 . 打印出那些异常消息的速度令人难以置信,将它们隐藏在visual studio中并不会加快速度 .

  • 7

    在VB.NET中:

    <DebuggerHidden()> _
    Public Function Write(ByVal Text As String) As Boolean
       ...
    
  • 4

    我认为流正在抛出这个异常,所以你的尝试范围缩小以捕获它 .

    在不同的范围周围添加一些try catch组合,直到你 grab 它实际被抛出的位置,但它似乎发生在你的使用之外,因为stream对象不是在using的范围内创建的 .

相关问题