Async wyjątek nie zostanie złapany lub połknięty

Aktualizacja z przyszłości: TL; DR do przechwytywania wyrażeń w metodach asynchronicznych, które musiszawait, Task.WaitAlllub.Result.

Stworzyłem nieco skomplikowaną metodę asynchroniczną, która uruchamia inne metody asynchroniczne. Możesz zignorować większość z nich, ponieważ interesująca jest tylko linia var mSpekTask ... Nie dbam o logikę, chcę tylko wiedzieć, gdzie poszedł mój wyjątek. Moim głównym problemem jest to, że ex.ToString () nigdy nie jest trafiony, chociaż wewnątrz mSpecTask na pewno zdarzy się wyjątek.

public async Task LoadAsync(IEnumerable<ProductRequest> feed, int? customerId,
      IProgress<int> mSpecProgress, Action<Task> mSpecCompletionHandler)
  {
        var ids = feed.Select(x => x.ProductId.ToString()).Distinct().ToList();

        try
        {
           var mSpecTask = this.LoadMSpecAsync(mSpecProgress, ids);
        }
        catch (Exception ex)
        {
           ex.ToString();
        }
  }

Oto kod dla LoadMSpecAsync

public Task<ResultSet> LoadMSpecAsync(IProgress<int> prg,
     IEnumerable<string> ids)
  {
     return this.LoadAsync(prg, ids, Selector.M, SPMS, x => x.Order);
  }

Oto kod dla LoadAsync, czekaj na db.ExecuteTVP (progress, spName, ids, parameters) generuje wyjątek.

      private async Task<Dictionary<Pair, dynamic>> LoadAsync(IProgress<int> progress,
     IEnumerable<string> ids, Selector s, string spName, Func<dynamic, int> k,
      Func<dynamic, dynamic> f = null, object parameters = null)
  {
     parameters = new ExpandoObject().CopyFromSafe(parameters);
     if (spName != SPMAP) ((dynamic)parameters).lang = this.languageCode;

     using (var db = new SqlConnection(this.connectionString))
     {
        await db.OpenAsync();

        var results = await db.ExecuteTVP(progress, spName, ids, parameters);

        db.Close();
     }

     return this.data[s];
  }

questionAnswers(3)

yourAnswerToTheQuestion