На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> WCF клиент: обработка исключений
    Здравствуйте. Я начал учить C# и WCF неделю назад, отсюда такие глупые вопросы:
    Предположим, есть некий WCF сервис
    ExpandedWrap disabled
          [ServiceContract]
          public interface IService
          {
              [OperationContract]
              void Method1();
       
              [OperationContract]
              //...
              //...
              //...
          }

    и клиент этого сервиса
    ExpandedWrap disabled
      void Main()
      {
          ServiceClient Client = new ServiceClient();
          //...
      }

    Во избежание вылетов вызываю методы в блоке try
    ExpandedWrap disabled
      try
      {
          Client.Method1();
      }
      catch(Exception ex)
      {
          Client.Abort();
          MessageBox.Show(ex.ToString());
          Application.Current.Shutdown();
      }


    Если метод всего 1, блоки try-catch глаза не мозолят. А если их много (Client.Method1(), Client.Method2(), Client.Method3()...) и вызывать каждый в отдельном блоке try-catch, код выглядит просто ужасно. Можно выкинуть эти try-catch, но тогда клиент будет падать, если сервер "временно недоступен" или просто-напросто на компьютере клиента отсутствует подключение к интернету.
    То есть, если вызывать каждый метод в отдельном try-catch, получается стабильный, но ужасно НЕКРАСИВЫЙ код. А если без try-catch, соответственно красивый, но НЕСТАБИЛЬНЫЙ.
    Возможно ли избавиться от try-catch и не потерять стабильность?
      Читай про обработку ошибок в WCF, например, тут.
        Spawn.NET
        Так и знал, что мне кинут именно эту ссылку. Это не то. В статье написано о том, как в клиенте обрабатывать ошибки, возникающие на сервере. А мне всего-то надо, чтобы клиент не падал с ошибкой, если по каким-то причинам не удалось подключиться к серверу. Как вариант - вызывать все методы сервиса в отдельных блоках try-catch. Но, повторюсь, если методов много, код получается некрасивый (одни try-catch). Других вариантов нет?
          То ли я чего-то не понял, то ли одно из двух...
          Чем тебе не по нутру вспомогательный метод, через который можно будет пропускать все методы, аля
          ExpandedWrap disabled
            public void DoAction(Action act)
            {
                try
                {
                    act();
                }
                catch {}
            }

          В статье красиво написаны подобные "помощники".
            Spawn.NET
            Тоже не вариант. Не все же методы сервиса имеют тип void. А для каждого типа делать свой DoAction - еще хуже, чем куча try-catch.
              GoldenJoe, Generic в "зубы".
              ExpandedWrap disabled
                        private T DoAction<T>(Func<T> act)
                        {
                            return act();
                        }
                Spawn.NET
                Про generic не знал, спасибо (в шарпе новичек же).
                Один минус только - придется реализовывать DoAction в каждом классе (ведь я вызываю методы сервиса не только в Main).
                  Цитата GoldenJoe @
                  Один минус только - придется реализовывать DoAction в каждом классе (ведь я вызываю методы сервиса не только в Main).

                  сделай static метод и вызывай откуда угодно
                  ExpandedWrap disabled
                    public class Program
                    {
                            public static T DoAction<T>(Func<T> act)
                            {
                                return act();
                            }
                    }
                     
                    public class Program2
                    {
                            private void Test()
                            {
                                Program.DoAction<bool>( ... );
                            }
                    }
                    Spawn.NET
                    Невозможно получить аргумент типа для метода '[имя проекта].App.DoAction<T>(System.Func<T>)' из данных использования. Попробуйте указать аргументы типа явным образом.
                    (класс называется App, ибо WPF, а не WinForms)

                    Добавлено
                    Такая ошибка возникает, когда я вызываю App.DoAction(Client.SomeMethod([параметры]));
                      Цитата
                      Такая ошибка возникает, когда я вызываю App.DoAction(Client.SomeMethod([параметры]));


                      ExpandedWrap disabled
                        App.DoAction<T>(Client.SomeMethod([параметры]));


                      где T возвращаемый тип
                        GoldenJoe, без возвращаемого типа (ну, или с типом void) - Action<T1,T2,...,TN>, где TN - типы параметров. С возвращаемым типом - Func, где последний T - возвращаемый тип, все предшествующие - типы параметров.
                        Action и Func это всего лишь делегаты, которые можешь насоздавать сам, если, например, потребуется больше 4-х параметров в Action или Func.
                          Наиболее подходящий перегруженный метод для '[неважно].App.DoAction<bool>(System.Func<bool>)' имеет несколько недопустимых аргументов. Подучить мне надо шарп видимо.
                            GoldenJoe, начни отсюда и далее по ссылкам.
                              Spawn.NET
                              Сделал так
                              ExpandedWrap disabled
                                public static T DoAction<T>(Func<T> action)
                                {
                                    try
                                    {
                                        return action();
                                    }
                                    catch (Exception ex)
                                    {
                                        //...  
                                    }
                                }

                              Если метод сервиса не принимает параметры - все ок.
                              Я так понял, если все-таки метод принимает параметры, надо наплодить еще DoAction'ов: с Func<T, T> для 1 параметра, с Func<T, T, T> для 2...
                              Или я не так понял?
                                В зависимости от типов параметров - да, хотя я бы скорее всего передавал бы массив параметров типа object, а там уж разбирался что к чему, чтобы много методов не плодить.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0454 ]   [ 16 queries used ]   [ Generated: 2.05.24, 20:03 GMT ]