我应该忽略WCF中的第一次机会异常吗



在Visual Studio中运行WCF服务时,我在调试输出中看到了大量异常。

A first chance exception of type 'System.ServiceModel.FaultException' occurred in System.ServiceModel.dll
A first chance exception of type 'System.InvalidOperationException' occurred in System.ServiceModel.Channels.dll

它们似乎被不规则地抛出:在任何情况下,我都无法计算出任何模式(即从每隔几秒到几十秒)。

如果我在FaultException上将debug设置为break,我会看到它们是由System.ServiceModel.Dispatcher.ErrorBehavior.ThrowAndCatch(Exception e, Message message)抛出的。

异常消息为{"The message with To '' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher. Check that the sender and receiver's EndpointAddresses agree."}

显而易见的答案似乎是"你的地址是空的"。但这种情况发生在任何客户端连接之前。

这只是"正常",还是我做错了什么的症状?

快速答案是">是的,您可以忽略首次机会异常"。它们是实际上已经处理过的例外情况。因此,它们应该被视为一个正常的执行工作流。

visualstudio会通知开发人员发生的每一个异常,即使它已被处理。每个异常都会抛出一个"第一次机会异常",该异常不会中断正常的调试会话。如果这个第一次机会异常没有得到处理,那么调试会话就会被"第二次机会异常"中断"第一次机会异常"的值仅用于开发人员的洞察力知识

在这篇博客文章中,你可以看到更多关于首次机会例外的详细信息。从参考帖子复制:

第一次机会异常是否意味着我的代码中存在问题?第一次出现的异常消息通常并不意味着代码中存在问题。对于能够优雅地处理异常的应用程序/组件,首次出现的异常消息会让开发人员知道遇到了异常情况并得到了处理。

希望我能帮上忙!

通常,如果您在调试窗口中看到首次出现的异常,但如果它们没有崩溃,例如,在没有附加调试器的情况下运行的w3wp.exe进程,那么您可以非常确定框架或生成的类正在捕获异常并进行处理。但是,如果此类消息数量过多,或者您怀疑不应该抛出任何消息(即使已处理),则可以使用Visual Studio的异常设置来中断已处理的错误,以便进行调试/跟踪。

我同意从框架中抛出的所有第一次机会异常都可以被安全地忽略,我们发现,如果一个exception被吞噬(而不是"处理"),那么在生产代码库中捕获隐藏的/非常难以复制的错误是很有用的。为FirstChance异常附加一个处理程序,该处理程序记录到一个单独的日志文件中,并且仅在QA环境中启用(这些日志非常巨大),这帮助我们在自己的代码库中发现了几个错误。开发人员在一天结束时查看日志文件,查找不应安全忽略的内容。

虽然如果没有人决定吞下一个异常,这些错误本来就不应该出现在代码中,但在混乱的现实世界中,这是一个持续提高代码库质量的好工具。

相关内容

最新更新