Перенос веб-сервиса в блок try / catch - PullRequest
5 голосов
/ 11 декабря 2008

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

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

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

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

Ответы [ 6 ]

4 голосов
/ 15 декабря 2008

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

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

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

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

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

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

Джо.

2 голосов
/ 11 декабря 2008

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

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

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

#if !DEBUG
catch (Exception ex)
{
    // show messagebox, log, etc
}
#endif
1 голос
/ 04 января 2011
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 голос
/ 11 декабря 2008

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

0 голосов
/ 11 декабря 2008

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

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

0 голосов
/ 11 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...