4

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

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,我会看到它们被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."}

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

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

4

3 回答 3

4

快速的回答是“是的,你可以忽略第一次机会例外”。它们是实际上已经处理过的异常。因此,它们应该被视为正常的执行工作流程。

Visual Studio 会通知开发人员发生的每个异常,即使它已被处理。每个异常都会引发一个“第一次机会异常”,它不会中断正常的调试会话。如果未处理此第一次机会异常,则调试会话会被“第二次机会异常”中断。“第一次机会异常”的价值仅用于开发人员的洞察知识。

在这篇博文中,您可以看到有关首次机会异常的更多详细信息。从引用的帖子中复制:

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

希望我有所帮助!

于 2014-01-16T12:27:58.723 回答
0

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

于 2014-01-16T11:19:58.860 回答
0

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

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

于 2014-01-16T14:30:07.087 回答