Exceção assíncrona não sendo capturada ou sendo engolida

Atualize do futuro: TL; DR para capturar expressões em métodos assíncronos que você precisaawait, Task.WaitAllou.Result.

Eu criei um método assíncrono um pouco complicado que apenas executa outros métodos assíncronos. Você pode desconsiderar a maior parte dele, pois somente a linha var mSpekTask ... é de interesse, também, eu não me importo com a lógica, só quero saber para onde foi minha exceção. Meu principal problema é que ex.ToString () nunca é atingido, embora dentro do mSpecTask uma exceção definitivamente aconteça.

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();
        }
  }

Aqui está o código para LoadMSpecAsync

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

Aqui está o código para LoadAsync, aguarde db.ExecuteTVP (progress, spName, ids, parameters) gera uma exceção.

      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