【问题标题】:What exceptions may a generated service reference throw?生成的服务引用可能会引发哪些异常?
【发布时间】:2012-04-29 20:13:55
【问题描述】:

我使用“添加服务引用...”在 Visual Studio 2010 中添加了一个 Web 服务。这会在名为Reference.cs 的文件中生成一些代码。现在,如果我调用其中一种方法,我不知道该方法可能会抛出什么异常。大概可以抛出SocketExceptionIOException等网络相关异常?

可以在 msdn 或源代码中检查 .NET 中的常规方法,以揭示可能引发的异常,例如 File.Open。这里很清楚我应该捕获并重新抛出哪些异常以在稍后阶段显示错误消息。

对于那些生成的方法,我怎么知道它们可能抛出什么异常?

【问题讨论】:

  • 感谢您的链接。我知道如何区分应该捕获的异常和应该冒泡的异常 - 因此这个问题。但是,生成的代码没有任何 /// 标记或任何暗示可能引发哪些异常的信息。
  • 检查以下[线程][1] [1]:stackoverflow.com/questions/264747/…

标签: c# wcf web-services service-reference


【解决方案1】:

好吧,在这种情况下存在“标准”异常和“自定义”异常(由服务开发人员定义为 FaultContacts 并出现在服务合同参考中)。

在第一种情况下,我想你的担忧是CommunicationExceptionTimeoutException;这些记录了ICommunicationObject.BeginOpenICommunicationObject 的其他“打开”方法(@​​987654324@)的可能例外情况。 CommunicationObjectFaultedException 记录了“关闭”方法。还有QuotaExceededException用于发送消息的方法,例如IRequestChannel.Request。在many more that might be 中,这些应该是可发现的。

值得注意的是,上面链接的 MSDN 文章是这样的:

通道抛出的所有异常都必须是 System.TimeoutException, System.ServiceModel.CommunicationException, 或从 CommunicationException 派生的类型。 (例外情况如 ObjectDisposedException 也可能被抛出,但仅表示 调用代码滥用了通道。如果使用通道 正确,它只能抛出给定的异常。)

然后是“故障”,这是在服务端引发的异常,并且(可能,如果启用)向调用者详细说明,然后调用者可以处理该异常或抛出适当的客户端异常:

生成故障时,自定义通道不应发送故障 直接,而是应该抛出异常,让上面的层 决定是否将该异常转换为故障以及如何发送 它。

频道State 提供Faulted 事件,您可以订阅该事件以在它达到这种状态时得到通知,并可能采取行动。默认情况下(不配置抑制(?))错误将作为托管异常引发;再次重申:

在 WCF 客户端中,通信期间发生的 SOAP 错误是 客户端应用程序感兴趣的将作为托管异常引发。 虽然在执行过程中可能会发生许多异常 任何程序,使用 WCF 客户端编程模型的应用程序都可以 期望处理 [...] 两种类型的异常,因为 交流。

还有this refers again 到上面提到的CommunicationExceptionTimeoutException

最后,至少现在是出乎意料的:

FaultException 监听器收到错误时抛出异常 运营合同中未预期或未指定的;通常 这发生在调试应用程序并且服务已 这 System.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults 属性设置为 true。

【讨论】:

  • 参考资料和所有答案都很棒!真的很喜欢第一句话。完美地回答了我的问题 - 我应该捕获 CommunicationException 并让其余部分冒泡,因为它们表明我(或生成的代码)错误地使用了通道方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 2010-12-22
  • 2017-03-03
  • 2016-08-07
相关资源
最近更新 更多