如何在 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
块中的值将被返回。
我有一本异步调用字典。问题是有时这些异步调用会抛出异常,但我不完全确定如何处理它们。 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
块中的值将被返回。