Я задавал тот же вопрос, поскольку мне пришлось реализовать некоторую обработку исключений при вызовах веб-служб в моем клиентском приложении, поэтому я оказался здесь. Хотя это старый вопрос, я хотел бы дать свои два цента, немного обновив его.
Ответ дан C. Лоуренс Уэнам был уже очень хорош и указывает на некоторую интересную информацию, хотя ссылка на блог сломана и Codeplex теперь архивирован.
Я нашел эти статьи очень ценными:
Отправка и получение ошибок
https://docs.microsoft.com/en-us/dotnet/framework/wcf/sending-and-receiving-faults
Ожидаемые исключения
https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/expected-exceptions
И эта статья от Michèle Leroux Bustamante (очевидно, создатель Генератора прокси WCF проекта CodePlex) очень полезна:
Элегантное прокси-решение для обработки исключений
http://www.itprotoday.com/microsoft-visual-studio/elegant-exception-handling-proxy-solution
Я все еще изучаю предмет, но, думаю, я буду использовать множество идей из Мишель. Я просто немного обеспокоен использованием отражения для вызова методов веб-службы, но мне интересно, будет ли это иметь какое-либо влияние в такой операции, которая уже по своей сути медленная.
Просто чтобы ответить здесь явно на то, что изначально было задано, какие исключения могут быть проверены для вызова веб-службы:
string errorMessage = null;
// A class derived from System.ServiceModel.ClientBase.
MyWebService wcfClient = new MyWebService();
try
{
wcfClient.Open();
wcfClient.MyWebServiceMethod();
}
catch (TimeoutException timeEx)
{
// The service operation timed out.
errorMessage = timeEx.Message;
}
catch (FaultException<ExceptionDetail> declaredFaultEx)
{
// An error on the service, transmitted via declared SOAP
// fault (specified in the contract for an operation).
errorMessage = declaredFaultEx.Detail.Message;
}
catch (FaultException unknownFaultEx)
{
// An error on the service, transmitted via undeclared SOAP
// fault (not specified in the contract for an operation).
errorMessage = unknownFaultEx.Message;
}
catch (CommunicationException commEx)
{
// A communication error in either the service or client application.
errorMessage = commEx.Message;
}
finally
{
if (wcfClient.State == CommunicationState.Faulted)
wcfClient.Abort();
else
wcfClient.Close();
}
Как указано в статьях, важен порядок перехвата исключений, поскольку FaultException<TDetail>
происходит от FaultException
, а FaultException
происходит от CommunicationException
.