异步异常不被抓住或被吞噬(Async exception not being caught or b

2019-08-17 06:48发布

从未来的更新:TL; DR赶上你要异步方法表达awaitTask.WaitAll ,或.Result

我创造了只运行其他异步方法有点令人费解的异步方法。 您可以忽略大部分仅行VAR mSpekTask ...感兴趣,另外,我不在乎逻辑,我只是​​想知道我的异常去。 我的主要问题是,ex.ToString()是从来没有击中即使内部mSpecTask异常definitly发生。

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

下面是LoadMSpecAsync代码

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

下面是LoadAsync代码,等待db.ExecuteTVP(进展,spName,IDS,参数)生成异常。

      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];
  }

Answer 1:

async方法抛出异常,该异常被放置在返回的Task 。 它不直接提出给调用者。 这是由设计。

所以,你必须要么awaitTask从返回LoadMSpecAsync或有你mSpecCompletionHandler审查其Task例外的说法。 它会显示在那里。



Answer 2:

您可以处理未观测到的任务异常如下:

TaskScheduler.UnobservedTaskException += (object sender, UnobservedTaskExceptionEventArgs eventArgs) =>
{
      eventArgs.SetObserved();
      ((AggregateException)eventArgs.Exception).Handle(ex =>
      {
          //TODO: inspect type and handle exception
          return true;
      });
};


Answer 3:

我要的答案添加到我自己的问题,因为存在是一个有用的信息一块我发现了。 中介方法LoadMSpecAsync被swalloing例外。 对于这种不发生它需要一点柚木。 你需要的返回类型和“回归”后的“等待”关键字之前添加async关键字。



文章来源: Async exception not being caught or being swallowed