What exceptions may a generated service reference throw?
Asked Answered
I

1

10

I have added a web service in Visual Studio 2010 using the "Add Service Reference...". This generates some code in a file called Reference.cs. Now, if I call one of the methods I wan't to know what exceptions the method may throw. Presumably it can throw network related exceptions such as SocketException or IOException?

Regular methods in .NET can be checked on msdn or inside the source code to reveal what exceptions may be thrown, like for example File.Open. Here it's clear what exceptions I should catch and rethrow to show error messages at a later stage.

For those generated methods, how can I know what exceptions they may throw?

Intense answered 18/4, 2012 at 12:6 Comment(2)
thanks for the link. I know how to differ between exceptions that should be catched and exceptions that should bubble though - Hence this question. However, the generated code does not have any ///<exceptions> tag or anything hinting about what exceptions might be thrown.Intense
Check the following [Thread][1] [1]: #265247Cotton
T
15

Well, there are 'standard' exceptions in this case, and 'custom' exceptions (those defined as FaultContacts by the service developer and present in the service contract reference).

In the first case your concerns, I would suppose, are CommunicationException and TimeoutException; these are documented possible exceptions for ICommunicationObject.BeginOpen and other 'opening' methods of ICommunicationObject (the base of the model). CommunicationObjectFaultedException is documented for 'closing' methods. There is also QuotaExceededException for methods that send messages, such as IRequestChannel.Request. Among the many more that might be, these should be discoverable.

Worth noting, from an MSDN article linked above, is this:

All exceptions thrown by channels must be either a System.TimeoutException, System.ServiceModel.CommunicationException, or a type derived from CommunicationException. (Exceptions such as ObjectDisposedException may also be thrown, but only to indicate that the calling code has misused the channel. If a channel is used correctly, it must only throw the given exceptions.)

Then there are 'Faults', which are exceptions raised on the service-side and (potentially, if enabled) are detailed to the caller, the caller can then handle that or throw the proper client-side exception:

When generating a fault, the custom channel should not send the fault directly, rather, it should throw an exception and let the layer above decide whether to convert that exception to a fault and how to send it.

The channel State offers an event of Faulted to which you can subscribe to to be informed when such a state it reached, and perhaps act. By default (without configuring supression (?)) the faults will be raised as managed exceptions; again, to reiterate:

In WCF clients, SOAP faults that occur during communication that are of interest to client applications are raised as managed exceptions. While there are many exceptions that can occur during the execution of any program, applications using the WCF client programming model can expect to handle exceptions of the [...] two types as a result of communication.

And this refers again to the CommunicationException and TimeoutException mentioned above.

Lastly, for now at least, is the unexpected:

FaultException exceptions are thrown when a listener receives a fault that is not expected or specified in the operation contract; usually this occurs when the application is being debugged and the service has the System.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults property set to true.

Trogon answered 18/4, 2012 at 12:40 Comment(1)
great answer with references and all! Really liked the first quote. Perfectly answered my question - I should catch CommunicationException and let the rest bubble through since they indicate I (or the generated code) use the channel methods incorrectly.Intense

© 2022 - 2024 — McMap. All rights reserved.