安全处理异常时,避免出现第一次机会异常消息
以下代码捕获EOS异常
using (var reader = new BinaryReader(httpRequestBodyStream)) { try { while (true) { bodyByteList.Add(reader.ReadByte()); } } catch (EndOfStreamException) { } }
那么,为什么我的控制台中仍然会出现首次机会异常?
A first chance exception of type 'System.IO.EndOfStreamException' occurred in mscorlib.dll
有没有办法隐藏这些第一次机会异常消息?
解决方案
回答
我认为该流将引发此异常,因此我们可以尝试缩小范围以捕获它。
在不同的作用域周围再添加一些try catch组合,直到我们将其实际抛出的地方捕获为止,但由于使用范围内未创建stream对象,因此它似乎发生在使用范围之外。
回答
"第一个机会"异常的要点是我们看到了它们的预处理程序,因此我们可以在调试时在抛出时停止它们。 "第二次机会"异常是没有适当处理程序的异常。有时我们想捕获"优先机会"异常,因为重要的是要观察抛出异常时发生的情况,即使有人正在捕获它。
没什么可担心的。这是正常现象。
回答
1)在Visual Studio中,我们可以更改调试器处理(中断)异常的方式的设置。
转到调试>异常。 (请注意,根据Visual Studio环境设置,此菜单可能不在菜单中。如果不是,请仅使用"自定义"菜单将其添加到菜单中。)
在那里,我们会看到一个对话框,讨论异常以及何时打破它们。
在"公共语言运行时异常"行中,我们可以取消选择抛出(如果出现这种情况,则应该停止困扰我们),也可以取消选择用户未处理的(我不建议这样做)。
2)我们收到的消息不应在控制台中,而应出现在Visual Studio的"输出"窗口中。如果是后者,那么我还没有找到删除它的可能性,但是如果我们在没有Visual Studio的情况下运行该应用程序,则它不会出现。
希望能有所帮助。
回答
与Java不同,.NET异常在处理能力方面非常昂贵,应在正常且成功的执行路径中避免处理异常。
我们不仅可以避免在控制台窗口中造成混乱,而且可以提高性能,并使诸如.NET CLR异常之类的性能计数器更有意义。
在此示例中,我们将使用
while (reader.PeekChar() != -1) { bodyByteList.Add(reader.ReadByte()); }
回答
为了避免看到消息,请右键单击输出窗口,然后取消选中"异常消息"。
但是,如果我们想知道何时在不设置断点和重新配置调试器的情况下引发异常,那么看到它们的发生可能会很好。
回答
在VB.NET中:
<DebuggerHidden()> _ Public Function Write(ByVal Text As String) As Boolean ...
回答
实际上,如果每秒有多个异常,则可以通过检查reader.EndOfStream-value来实现更好的性能。打印出这些异常消息的速度令人难以置信,并且将它们隐藏在Visual Studio中不会加快任何速度。