На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (2) 1 [2]  все  ( Перейти к последнему сообщению )  
> WCF клиент: обработка исключений
    Можно не плодить, для этого можно использовать анонимный делигат:

    ExpandedWrap disabled
              static bool SaveCall(Func<bool> _func)
              {
                  try
                  {
                      return _func();
                  }
                  catch (System.Exception ex)
                  {
                      return false;
                  }
              }


    Вызывать так:
    ExpandedWrap disabled
                 TestClass _testClient = new TestClass();
       
                 var _result = SaveCall(delegate()
                  {
                      _testClient.SameMethod0();
                      return true;
                  });
      maxim84_, вопрос был про метод с несколькими параметрами разных типов...
        Цитата
        maxim84_, вопрос был про метод с несколькими параметрами разных типов...

        все тоже самое:

        ExpandedWrap disabled
              public class TestData
              {
                  public string Name { get; set; }            
              }
           
              public class TestClass
              {
                  public void SameMethod0()
                  {
                      throw new Exception();
                  }
           
                  public TestData SameMethod1(string _arg, int _index)
                  {
                      Console.WriteLine("Call method 'SameMethod1'. Arg = {0}, Index={1}", _arg, _index);
           
                      return new TestData()
                      {
                          Name = "From SameMethod"
                      };
                  }
              }


        ExpandedWrap disabled
                      TestData _ReturnObject = null;
                      string _argForSameMethod1 = "adsadsa";
                      _result = SaveCall(delegate()
                      {
                          _ReturnObject = _testClient.SameMethod1(_argForSameMethod1, 100);
                          return true;
                      });
          А, ну отдельный класс возвращать, тогда да :)
            Вообще-то это для демонстрации..
              Как приду домой, попробую это
              ExpandedWrap disabled
                _result = SaveCall(delegate()
                {
                    _ReturnObject = _testClient.SameMethod1(_argForSameMethod1, 100);
                    return true;
                });


              А просто засунуть весь метод Main/App_Startup в блок try/catch не вариант? Код вроде будет медленнее выполняться, верно?
                Всё через Try...Catch точно пускать не советую...
                У клиента в классе Application вроде есть система отлова необработанных исключений, лучше её задействовать.
                  я вообще не очень пойму проблему...Да, есть какой-то Wcf сервис, методы которого очевидно не безопасные. И есть некий внешний код, который юзает методы сервиса. Ну так может и обернуть этот клиент в безопасную обертку? тогда во внешнем коде не будут мозолить глаза try...catch...Хотя, куда без них ))

                  P.S. всеравно не пойму проблему :)
                    Цитата maxim84_ @
                    Ну так может и обернуть этот клиент в безопасную обертку?

                    То есть создать вспомогательный класс вроде этого
                    ExpandedWrap disabled
                      public class Helper
                      {
                          private ServiceClient Client = new ServiceClient();
                       
                          public bool Method1()
                          {
                              try
                              {
                                  return Client.Method1();
                              }
                              catch
                              {
                                  //...
                              }
                          }
                      }

                    И так для каждого метода? Тоже не очень красивое решение.

                    Цитата Spawn.NET @
                    У клиента в классе Application вроде есть система отлова необработанных исключений, лучше её задействовать.

                    А вот это уже интересно.

                    Добавлено
                    Цитата maxim84_ @
                    всеравно не пойму проблему

                    Если повсюду try-catch - уже раздражает. Так еще в блоке catch у меня строк 5 кода, так надо. Получается еще и много повторяющегося кода (вот эти 5 строчек будут повторяться десятки раз, я ж не холлоуворд сервис пишу)
                      Цитата GoldenJoe @
                      А вот это уже интересно.

                      http://msdn.microsoft.com/ru-ru/library/system.windows.forms.application.threadexception.aspx
                        Spawn.NET, на эту статью уже натыкался. Только для Windows Forms. Я WPF юзаю, там этого нет. А мешать их вместе не рекомендуется.

                        Добавлено
                        Цитата GoldenJoe @
                        _result = SaveCall(delegate()
                        {
                        _ReturnObject = _testClient.SameMethod1(_argForSameMethod1, 100);
                        return true;
                        });

                        Работает, но хотелось бы еще попроще. Создать бы единый обработчик для CommunicationException, было бы очень хорошо (вместо try-catch для КАЖДОГО метода сервиса)

                        Добавлено
                        Или вместо
                        Цитата GoldenJoe @
                        _result = SaveCall(delegate()
                        {
                        _ReturnObject = _testClient.SameMethod1(_argForSameMethod1, 100);
                        return true;
                        });
                          GoldenJoe, в WPF аналог - System.Windows.Application.DispatcherUnhandledException он экземплярный, а не статичный, как в Winforms, так что в Application.Current будет.
                            Spawn.NET, огромное спасибо! Все работает! Лови плюс.

                            P.S. в C# есть есть некий оператор, позволяющий узнать, например, что некоторый экземпляр класса Exception является CommunicationException. Точно есть, но что-то не гуглится.

                            Добавлено
                            Как все просто оказывается.
                            ExpandedWrap disabled
                              if (ex is CommunicationException)
                              {
                                  //...
                              }


                            Всем спасибо, от try-catch избавился. Вопрос решен.
                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                            0 пользователей:


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