2012-04-18 2 views
9

Я добавил веб-службу в Visual Studio 2010 с помощью «Добавить ссылку на службы ...». Это генерирует некоторый код в файле с именем Reference.cs. Теперь, если я назову один из методов, я не буду знать, какие исключения метод может бросить. Предположительно, он может вызывать связанные с сетью исключения, такие как SocketException или IOException?Какие исключения могут вызывать сгенерированные ссылки на службы?

Регулярные методы в .NET могут быть проверены на msdn или внутри исходного кода, чтобы выявить, какие исключения могут быть выбраны, например, File.Open. Здесь ясно, какие исключения я должен уловить и перебросить, чтобы показать сообщения об ошибках на более позднем этапе.

Для тех сгенерированных методов, как я могу узнать, какие исключения они могут бросить?

+0

спасибо за ссылку. Я знаю, как различаться между исключениями, которые следует уловить, и исключениями, которые должны пузыриться, - вот этот вопрос. Тем не менее, сгенерированный код не имеет никакого /// тега или чего-либо намека на то, какие исключения могут быть выбраны. – vidstige

+0

Проверьте следующее [тема] [1] [1]: http://stackoverflow.com/questions/264747/finding-out-what-exceptions-a-method-might-throw-in- c-sharp – Tomtom

ответ

14

Ну, в этом случае есть «стандартные» исключения и «пользовательские» исключения (те, которые определены разработчиком сервиса FaultContact) и представлены в ссылке на сервисный контракт).

В первом случае ваши проблемы, я бы предположил, это CommunicationException и TimeoutException; это документированные возможные исключения для ICommunicationObject.BeginOpen и другие методы «открытия» ICommunicationObject (base of the model). CommunicationObjectFaultedException документирован для методов «закрытия». Существует также QuotaExceededException для методов отправки сообщений, таких как IRequestChannel.Request. Среди many more that might be они должны быть доступны для обнаружения.

Стоит отметить, из статьи MSDN связаны выше, заключается в следующем:

Все исключения, генерируемые с помощью каналов должны быть либо System.TimeoutException, System.ServiceModel.CommunicationException, или тип, полученный из CommunicationException. (Исключения, такие как ObjectDisposedException также могут быть выброшены, но только, чтобы указать, что код вызова был неправильно канал. Если канал используется правильно, он должен только выбросить данные исключения.)

Тогда являются «Дефектами», которые являются исключениями, поднятых на служебной стороне и (потенциально, если он включен) детализированы на вызывающую стороне, затем может справиться с этим или бросить правильную сторону клиента исключение:

При генерации неисправность, пользовательский канал не должен посылать ошибку напрямую, скорее, он должен t hrow исключение и пусть слой выше решает, следует ли преобразовать это исключение в неисправность и как отправить .

Канал State предлагает событие Faulted, к которому вы можете подписаться на быть информированным, когда такое состояние, которое он достиг, и, возможно, действовать. По умолчанию (без настройки supression (?)) Ошибки будут возникать как управляемые исключения; еще раз, чтобы подтвердить:

В клиентах WCF, ошибки SOAP, которые возникают в процессе общения, которые являются , представляющего интереса для клиентских приложений выращиваются как управляемые исключения. Несмотря на то, что во время выполнения может произойти множество программ, приложения, использующие модель программирования клиента WCF, могут ожидать обработки исключений из [...] двух типов в результате связи .

И this refers again к CommunicationException и TimeoutException упомянутой выше.

Наконец, в настоящее время, по крайней мере, является неожиданным:

FaultException исключения выбрасываются, когда слушатель получает ошибку , не ожидается, или указанный в контракте операции; обычно Это происходит, когда приложение отлаживается, и у службы есть System.ServiceModel.Description.ServiceDebugBehavior.IncludeExceptionDetailInFaults Свойство установлено в true.

+0

отличный ответ со ссылками и всем! Очень понравилась первая цитата. Прекрасно ответил на мой вопрос - я должен поймать CommunicationException и позволить остальным пузыриться, поскольку они указывают, что I (или сгенерированный код) неправильно используют методы канала. – vidstige

Смежные вопросы