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

以下代码捕获EOSexception

using (var reader = new BinaryReader(httpRequestBodyStream)) { try { while (true) { bodyByteList.Add(reader.ReadByte()); } } catch (EndOfStreamException) { } } 

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

在mscorlib.dll中发生了types“System.IO.EndOfStreamException”的第一个机会exception

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

“一次机会”例外的一点是,你看到它们是预处理程序,以便在投掷点debugging时停下来。 “二次机会”的例外是没有适当处理程序的例外。 有时候你想要捕捉“一次机会”的exception,因为即使有人在捕捉它时,看看它发生了什么也很重要。

没有什么可以关心的 这是正常的行为。

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

但是,如果您有兴趣知道什么时候抛出exception而不设置断点并重新configurationdebugging器,那么查看它们可能会很好。

1)在Visual Studio中,您可以更改debugging器处理(中断)exception的方式的设置。

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

在那里你会看到一个exception的对话框,什么时候打断它们。

在“公共语言运行时exception”这一行中,您可以取消select抛出(应该停止打扰一次抛出的exception),如果需要,也可以取消selectUser-unhandeled(我不推荐)。

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

希望有所帮助。

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

您不仅可以避免在控制台窗口中出现混乱,而且性能也会提高,并且会使性能计数器(如.NET CLRexception)更有意义。

在这个例子中,你会使用

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

我有这个问题,并不能找出exception被抛出的地方。 所以我的解决scheme是让Visual Studio停止执行这种exception。

  1. 导航到“debugging/例外”
  2. 展开“公共语言运行时例外”树。
  3. 展开“系统”分支。
  4. 向下滚动到“NullReferenceException”所在的位置,然后选中“throw”checkbox,并取消选中“user-handled”。
  5. debugging你的项目。

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

 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 

这可以让你沉默其他评论中提到的,但仍然确保你能够意识到他们。 如果我将一条消息和时间戳记logging到一个文本文件中,我发现很高兴看到有多less人正在投掷。

实际上,如果每秒有很多例外,你可以通过检查reader.EndOfStream-value来获得更好的性能。打印这些exception消息的速度令人难以置信,并且将它们隐藏在visual studio中不会加速任何事情。

在VB.NET中:

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

我认为这个stream是抛出这个exception,所以你的尝试是缩小范围来捕捉它。

在不同的作用域周围添加更多的try catch组合,直到你捕获它实际被抛出的地方,但是它看起来是在我们使用的外部发生的,因为stream对象不是在使用范围中创build的。