gpt4 book ai didi

c# - 异步异常未被捕获或被吞噬

转载 作者:太空宇宙 更新时间:2023-11-03 17:54:30 26 4
gpt4 key购买 nike

future 的更新:TL;DR 以捕获异步方法中的表达式,您必须awaitTask.WaitAll.结果.

我创建了一个有点复杂的异步方法,它只运行其他异步方法。您可以忽略其中的大部分内容,因为只有 var mSpekTask... 这行感兴趣,而且,我不关心逻辑,我只想知道我的异常发生在哪里。我的主要问题是 ex.ToString() 永远不会被命中,即使在 mSpecTask 内部确实发生了异常。

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 的代码,await db.ExecuteTVP(progress, spName, ids, parameters) 产生异常。

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

最佳答案

async 方法抛出异常时,该异常会被放置在返回的 Task 中。它不会直接向调用者提出。这是设计使然。

因此,您必须等待 LoadMSpecAsync 返回的Task 或让您的mSpecCompletionHandler 检查其Task 异常参数。它会出现在那里。

关于c# - 异步异常未被捕获或被吞噬,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15202820/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com