我使用“添加服务引用...”在Visual Studio 2010中添加了一个Web服务。这会在名为Reference.cs
的文件中生成一些代码。现在,如果我调用其中一种方法,我就不知道该方法可能抛出的异常。据推测,它可以抛出网络相关的例外,例如SocketException
或IOException
?
可以在msdn或源代码内部检查.NET中的常规方法,以揭示可能抛出的异常,例如File.Open。这里很清楚我应该捕获哪些异常并重新抛出以在稍后阶段显示错误消息。
对于那些生成的方法,我怎么知道它们可能抛出的异常?
答案 0 :(得分:15)
在这种情况下,存在“标准”异常和“自定义”异常(服务开发人员定义为FaultContact
并出现在服务合同参考中)。
在第一种情况下,我认为您的问题是CommunicationException
和TimeoutException
;这些是ICommunicationObject.BeginOpen
以及ICommunicationObject
(base of the model)的其他“开放”方法的可能例外情况。 {'3}}记录了'结束'方法。发送消息的方法也有CommunicationObjectFaultedException
,例如QuotaExceededException
。在IRequestChannel.Request
中,这些应该是可以发现的。
值得注意的是,从上面链接的MSDN文章中可以看出:
频道引发的所有异常必须是a
System.TimeoutException
,System.ServiceModel.CommunicationException
, 或者从CommunicationException派生的类型。 (例如 也可能抛出ObjectDisposedException,但仅用于指示 调用代码滥用了频道。如果使用了频道 正确地说,它必须只抛出给定的异常。)
然后有'Faults',这是在服务端引发的异常,并且(可能,如果启用)详细给调用者,调用者可以处理它或抛出正确的客户端异常:
生成故障时,自定义通道不应发送故障 直接相反,它应该抛出一个异常并让上面的层 决定是否将该异常转换为故障以及如何发送 它
频道State
提供Faulted
的事件,您可以订阅该事件,以便在达到此类状态时获得通知,并可能采取行动。默认情况下(不配置抑制(?)),故障将作为托管异常引发;再次重申:
在WCF客户端中,在通信期间发生的SOAP错误 客户端应用程序感兴趣的是托管异常。 虽然在执行期间可能会发生许多异常 任何程序,使用WCF客户端编程模型的应用程序都可以 期望处理两种类型的例外 通信。
many more that might be与上述CommunicationException
和TimeoutException
。
最后,至少现在是出乎意料的:
当侦听器收到错误时,会抛出
FaultException
个异常 操作合同中未预期或指定的;平时 当调试应用程序并且服务具有时,会发生这种情况 该System.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults
属性设置为true。