Обработка исключений в асинхронных лямбда-вызовах Silverlight - PullRequest
1 голос
/ 02 декабря 2010

В Silverlight я использую лямбды для извлечения данных из моего сервиса (в этом примере - Служба данных WCF).Исключения внутри функции обратного вызова поглощаются системой, если я не обработаю их с помощью метода try.Например:

this.Context.BeginSaveChanges(() =>
{
  // throwing an exception is lost and the Application_UnhandledException doesn't catch it

}, null);

У меня есть вспомогательная функция для регистрации исключения и перенаправления на страницу общих ошибок aspx, но затем я должен обернуть все в лямбдах с помощью try / catches, что нормально, если у меня естьсделать это, но есть ли лучший способ?

1 Ответ

2 голосов
/ 02 декабря 2010

Вы можете создать набор вспомогательных методов для переноса лямбда-выражений с помощью: -

 public static class Helper
 {
    public static AsyncCallback GetAsyncCallback(Action<IAsyncResult> inner)
    {
        return (a) =>
        {
            try
            {
                inner(a);
            }
            catch (Exception err)
            {
                // Your handling for "uncaught" errors
            }
        };
    }

    public static Action GetAction(Action inner)
      {
         return () =>
         {
             try
             {
                 inner();
             }
             catch (Exception err)
             {
                 // Your handling for "uncaught" errors
             }
         };
      }

      public static Action<T> GetAction(Action<T> inner)
      {
         return (a) =>
         {
             try
             {
                 inner(a);
             }
             catch (Exception err)
             {
                 // Your handling for "uncaught" errors
             }
         };
      }
      // and so on also:-

      public static Func<T> GetFunc(Func<T> inner;)
      {
         return () =>
         {
             try
             {
                 return inner();
             }
             catch (Exception err)
             {
                 // Your handling for "uncaught" errors
             }
         };
      }
      public static Func<T1, TReturn> GetFunc(Func<T1, TReturn> inner;)
      {
         return (a) =>
         {
             try
             {
                 return inner(a);
             }
             catch (Exception err)
             {
                 // Your handling for "uncaught" errors
             }
         };
      }
 }

Теперь вы можете переносить лямбда-выражения, не беспокоясь об обработке исключений по умолчанию для стандартного шаблона: -

this.Context.BeginSaveChanges(Helper.GetAsyncCallback((ar) =>             
{             
  // Only needs specific exception handling or none at all             

}), null);             
...