Перенос веб-сервиса в блок try / catch

Лучше ли оборачивать метод / вызов веб-службы в блок try / catch?

Я не думаю, что запросы веб-сервисов являются причиной сбоя настольных приложений .NET? Поэтому я думал, что все вызовы должны быть заключены в try / catch, чтобы предотвратить это.

Хорошая идея?

Кроме того, это должно вызвать исключение или просто пустую выгоду?

11.12.2008 14:59:58
6 ОТВЕТОВ
РЕШЕНИЕ

Я предполагаю, что вы используете WCF, так как ваш вопрос помечен им. Хорошая практика в обработке исключений с помощью WFC - не позволять исключениям пузыриться по проводам для вашего потребителя, а вместо этого выбрасывать значимые исключения FaultExceptions.

В вашей работе всегда должен быть блок try ... catch, если есть вероятность, что он может сгенерировать исключение. Если вы разрешите необработанное исключение «пузыриться», это может привести только к двум сценариям: если вы настроили свою службу так, чтобы разрешать подробности исключений при сбоях, вы откроете для себя внутреннюю часть вашей службы, открывая себя для нарушений безопасности. Или вы не настроили это в своей службе, и потребитель получает очень общее сообщение, указывающее, что что-то пошло не так, что не очень полезно для них или для группы поддержки.

Что вы должны сделать, это объявить одно или несколько исключений FaultException, в зависимости от того, какие сообщения вы хотите, чтобы пользователь получил от вашей операции, и оформить их как FaultContracts в объявлении вашей операции. Тогда вы можете попытаться ... поймать определенные исключения и выбросить конкретные ошибки. Вы также можете попробовать ... поймать, что ловит исключение и выдать очень общую ошибку.

Главное здесь - не раскрывать слишком много информации о том, что происходит внутри вашей работы - особенно следы стека!

Ошибка - просто еще один контракт данных, поэтому он объявлен в вашем WSDL. Это означает, что ваш потребитель может специально отследить ошибку и реагировать на ошибки, вызванные вашей работой, как если бы это было исключение из их кода.

Надеюсь это поможет.

Джо.

4
15.12.2008 13:36:46

это случай, который может привести к возникновению исключения, так что да, оно должно быть помещено в блок try catch.

Что делать с обработчиком исключений, зависит от логики программы ...

0
11.12.2008 15:09:32

Поместить метод веб-службы в блок try catch - хорошая идея, поскольку вы заявили, что не хотите аварийно завершать работу вызывающего приложения, поскольку в методе веб-службы что-то пошло не так.

Кроме того, вместо того, чтобы выдавать исключение клиенту, который все равно ничего не может с этим поделать, вы можете рассмотреть вопрос о том, чтобы все методы веб-службы возвращали структуру или небольшой класс, который может содержать состояние вызова, код ошибки и дружеское сообщение, которое может объяснить ошибку.

0
11.12.2008 15:11:50

Да, вы должны заключить вызов Web-сервиса в try-catch. НЕ используйте пустую добычу, поскольку они (в основном) - чистое зло. Ваш блок catch должен как минимум регистрировать исключение. Я не знаю о логике ваших приложений, но, вероятно, пользователю должно быть показано какое-то сообщение (например, «информация из сервиса не получена из-за технической ошибки»).

1
11.12.2008 15:11:53

Это нормально, но попробуйте просто перехватить типы исключений, которые вы можете обработать.

Избегайте перехвата любых «исключений» или, если вы это сделаете, войдите в систему и / или предупредите пользователя и / или повторите попытку вызова веб-службы.

Если это приложение для форм Windows, я обычно заключаю последний «Exception» в блок #if DEBUG, чтобы избежать скрытия исключений при отладке или тестировании.

#if !DEBUG
catch (Exception ex)
{
    // show messagebox, log, etc
}
#endif
2
11.12.2008 21:26:23
using System;
using System.ServiceModel;
using Entities; //my entities
using AuthenticationService; //my webservice reference

namespace Application.SL.Model
{
    public class AuthenticationServiceHelper
    {
        /// <summary>
        /// User log in
        /// </summary>
        /// <param name="callback"></param>
        public void UserLogIn(Action<C48PR01IzhodOut, Exception> callback)
        {
            var proxy = new AuthenticationServiceClient();

        try
        {
            proxy.UserLogInCompleted += (sender, eventargs) =>
            {
                var userCallback = eventargs.UserState as Action<C48PR01IzhodOut, Exception>;
                if (userCallback == null)
                    return;

                if (eventargs.Error != null)
                {
                    userCallback(null, eventargs.Error);
                    return;
                }
                userCallback(eventargs.Result, null);
            };
            proxy.UserLogInAsync(callback);
        }
        catch (Exception ex)
        {
            proxy.Abort();
            ErrorHelper.WriteErrorLog(ex.ToString());
        }
        finally
        {
            if (proxy.State != CommunicationState.Closed)
            {
                proxy.CloseAsync();
            }
        }
        }
}

Это хорошая практика или есть место для улучшения?

1
4.01.2011 12:57:58