如何在 ToDictionary C# 中使用 TryCatch 语句?

How to use TryCatch Statement in ToDictionary C#?

我有一本异步调用字典。问题是有时这些异步调用会抛出异常,但我不完全确定如何处理它们。 GetUserLicenseTypes return 是一个列表,所以如果我确实遇到异常,我仍然想 return 一个空列表。

var tasks = allCompanyUsers.ToDictionary(
                u => u.Id,
                u => _subscriptionService.GetUserSubscription(companyId, u.Id));

            await Task.WhenAll(tasks.Values);

            var licenseListByUserId = tasks.ToDictionary(
                kvp => kvp.Key,
                kvp => kvp.Value.Result);

下面的代码不起作用,但我想做这样的事情

var tasks = allCompanyUsers.ToDictionary(
                u => u.Id,
                u => {
try{
     return _subscriptionService.GetUserSubscription(companyId, u.Id);
}catch{
     return new List<string>();
}
});

            await Task.WhenAll(tasks.Values);

            var licenseListByUserId = tasks.ToDictionary(
                kvp => kvp.Key,
                kvp => kvp.Value.Result);

注意:我收到反馈说我应该一起避免异常,但目前很难做到,因为 GetUserSubscription 函数已经在很多地方使用,所以我们的应用程序使用的典型约定是 trycatch 语句处理这些抛出的错误。

看起来你的字典值的类型是 Task<List<string>>,但在你的 catch 块中你 return 一个 List<string>。如果你 return 一个任务,它应该工作:

var tasks = allCompanyUsers.ToDictionary(
u => u.Id,
u =>
{
   try
   {
        return _subscriptionService.GetUserSubscription(companyId, u.Id);
   }
   catch
   {
        return Task.FromResult(new List<string>());
   }
});

这是一种方法:

async Task<IEnumerable<string>> GetSubscriptions(Guid userId)
{
    try { return await _subscriptionService.GetUserSubscription(companyId, userId); }
    catch { return new List<string>(); }
}

var idsWithSubscriptions = await Task.WhenAll(allCompanyUsers
    .Select(async u => (
        u.Id,
        Subscription: await GetSubscriptions(u.Id))));

var licenseListByUserId = idsWithSubscriptions.ToDictionary(
    iws => iws.Id,
    iws => iws.Subscription);

因为等待从 GetUserSubscription 返回的 Task,它会展开并抛出任何 Exception,这意味着 catch 块中的值将被返回。