77

以下代码捕获 EOS 异常

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

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

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

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

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

4

9 回答 9

190

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

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

于 2008-09-13T18:48:25.280 回答
79

“第一次机会”异常的意义在于您正在看到它们的预处理程序,以便您可以在调试期间在抛出点时停止它们。“第二次机会”异常是没有适当处理程序的异常。有时您想捕获“第一次机会”异常,因为重要的是要查看抛出异常时发生的情况,即使有人正在捕获它。

没什么好担心的。这是正常行为。

于 2008-09-12T05:56:34.847 回答
20
  1. 在 Visual Studio 中,您可以更改调试器处理(中断)异常的方式的设置。

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

    在那里,您会看到一个异常对话框以及何时中断它们。

    在“Common Language Runtime Exceptions”行中,您可以取消选择 throwed (这应该不会再让您担心第一次机会异常),如果需要,您还可以取消选择 User-unhandeled(我不推荐)。

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

于 2008-09-12T06:06:14.260 回答
11

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

您不仅可以避免控制台窗口中的混乱,而且您的性能也会得到提高,并且它会使像 .NET CLR Exceptions 这样的性能计数器更有意义。

在此示例中,您将使用

while (reader.PeekChar() != -1)
{
    bodyByteList.Add(reader.ReadByte());
}
于 2008-09-12T06:32:37.210 回答
7

我遇到了这个问题,无法弄清楚异常是在哪里引发的。所以我的解决方案是让 Visual Studio 停止执行这种异常。

  1. 导航到“调试/异常”
  2. 展开“公共语言运行时异常”树。
  3. 展开“系统”分支。
  4. 向下滚动到“NullReferenceException”所在的位置,选中“throw”复选框,取消选中“user-handled”。
  5. 调试您的项目。
于 2012-10-26T11:32:55.293 回答
4

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

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

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

于 2014-04-18T18:16:17.170 回答
2

实际上,如果每秒有很多异常,您可以通过检查 reader.EndOfStream-value 来获得更好的性能。打印出这些异常消息的速度非常慢,并且将它们隐藏在 Visual Studio 中不会加快任何速度。

于 2010-05-09T21:49:50.337 回答
-1

在 VB.NET 中:

<DebuggerHidden()> _
Public Function Write(ByVal Text As String) As Boolean
   ...
于 2009-08-07T21:23:20.477 回答
-4

我认为流正在引发此异常,因此您的尝试范围缩小以捕获它。

在不同的范围内添加更多的 try catch 组合,直到你在它实际被抛出的地方捕获它,但它似乎发生在你使用的外部,因为流对象不是在使用的范围内创建的。

于 2008-09-12T05:50:17.637 回答