動物名稱是從 API 中獲取的,如果找不到動物,該 API 可能會回傳 404。但是為了正確記錄錯誤,我們需要訪問動物的國家。是否可以?我從一個叫 Stephen Cleary 的人那里讀到了一些東西,這讓我認為 lambdas 是可能的,但我找不到任何東西。
var gettingNames = new List<Task<string>>();
foreach (var animal in animals)
{
gettingNames.Add(this.zooApi.GetNameAsync(animal));
}
try
{
await Task.WhenAll(gettingNames);
}
catch (Exception e)
{
var exception = gettingNames.Where(task => task.IsFaulted)
.SelectMany(x => x.Exception.InnerExceptions).First();
this.logger.LogError("The animal name from {Country} was not found",
animal.Country); // This is the goal
}
uj5u.com熱心網友回復:
解決此問題的一種方法是將每個投影Animal到Task包含比裸名稱或裸錯誤更多資訊的 。例如,您可以將其投影到Task<ValueTuple<Animal, string, Exception>>包含三條資訊的 a 中:動物、來自 的動物的學名zooApi以及呼叫該zooApi.GetScientificNameAsync方法時可能發生的錯誤。
進行此投影的最簡單方法是 LINQSelect運算子:
List<Task<(Animal, string, Exception)>> tasks = animals.Select(async animal =>
{
try
{
return (animal, await this.zooApi.GetScientificNameAsync(animal),
(Exception)null);
}
catch (Exception ex)
{
return (animal, null, ex);
}
}).ToList();
(Animal, string, Exception)[] results = await Task.WhenAll(tasks);
foreach (var (animal, scientificName, error) in results)
{
if (error != null)
this.logger.LogError(error,
$"The {animal.Name} from {animal.Country} was not found");
}
uj5u.com熱心網友回復:
你幾乎搞定了。:)
而不是有一個List<Task<string>>你需要一個Dictionary<Task<string>, string>結構:
static async Task Main()
{
var taskInputMapping = new Dictionary<Task<string>, string>();
var inputs = new[] { "input", "fault", "error", "test"};
foreach (var input in inputs)
{
taskInputMapping.Add(DelayEcho(input), input);
}
try
{
await Task.WhenAll(taskInputMapping.Keys);
}
catch
{
foreach (var pair in taskInputMapping.Where(t => t.Key.IsFaulted))
{
Console.WriteLine($"{pair.Value}: {pair.Key.Exception?.GetType().Name}");
}
}
}
static readonly ImmutableArray<string> wrongInputs =
ImmutableArray.Create("error", "fault");
static async Task<string> DelayEcho(string input)
{
if (wrongInputs.Contains(input)) throw new ArgumentException();
await Task.Delay(10);
return input;
}
taskInputMapping.Add(DelayEcho(input), input):將輸入存盤在任務本身旁邊taskInputMapping.Where(t => t.Key.IsFaulted): 遍歷出錯的任務$"{pair.Value}: {pair.Key.Exception?.GetType().Name}": 檢索輸入 相關錯誤
uj5u.com熱心網友回復:
我結合了答案并提出了這個:
var tasks = animals.Select(async animal =>
{
try
{
return await this.zooApi.GetNameAsync(animal);
}
catch (Exception ex)
{
this.logger.LogError(error,
$"The {animal.Name} from {animal.Country} was not found");
return null;
}
});
var results = await Task.WhenAll(tasks);
foreach (var name in results.Where(x => x != null))...
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/324122.html
下一篇:處理來自dao的預期例外
