AggregateException
Birden çok task'ın hatasını AggregateException ile öğrenirsin.
AggregateException
AggregateException birden fazla hatayı tek bir istisra altında toplar. Özellikle Task.WhenAll gibi birden çok task'ın paralel çalıştığı yerlerde karşına çıkar; çünkü birden çok task aynı anda hata vermiş olabilir.
İçindeki her bir hata InnerExceptions koleksiyonunda listelenir. Örnek: catch (AggregateException aggr) { foreach (var inner in aggr.InnerExceptions) { ... } }. Böylece her bir hatayı tek tek inceleyebilirsin.
InnerExceptions
AggregateException.InnerExceptions içindeki tüm alt istisraları veren bir ReadOnlyCollection'dır. Her birine döngü ile ulaşırsın. Bu, özellikle WhenAll'da hangi task'ların hata verdiğini bulmak için yararlıdır.
Eğer tek bir hata ile ilgileniyorsan aggr.InnerException de ilk hatayı verir. Flatten() metodu iç içe geçmiş AggregateException'ları düzleştirir; bu, alt task'ların da AggregateException fırlattığı derin zincirlerde kullanışlıdır.
Uygulama AggregateException'ı incele
İki async metot tanımla: static async Task FailA() ve static async Task FailB(). Her birinin gövdesinde await Task.CompletedTask; ve throw new InvalidOperationException("x"); olsun. Main'i static async Task Main yap. Task all = Task.WhenAll(FailA(), FailB()); ile paralel çalıştır. try { await all; } catch (Exception) { Console.WriteLine(all.Exception.GetType().Name); } ile AggregateException adını yazdır.
Örnek çözümü göster
FailA ve FailB gövdesinde await Task.CompletedTask; ve throw new InvalidOperationException("x"); yaz. Main'i static async Task Main() yapıp Task all = Task.WhenAll(FailA(), FailB()); try { await all; } catch (Exception) { Console.WriteLine(all.Exception.GetType().Name); }
Örnek çözüm:
using System;
using System.Threading.Tasks;
class Program
{
static async Task FailA()
{
await Task.CompletedTask;
throw new InvalidOperationException("x");
}
static async Task FailB()
{
await Task.CompletedTask;
throw new InvalidOperationException("x");
}
static async Task Main()
{
Task all = Task.WhenAll(FailA(), FailB());
try
{
await all;
}
catch (Exception)
{
Console.WriteLine(all.Exception.GetType().Name);
}
}
}
Kendini test et
-
catch türünü tamamla
try { await Task.WhenAll(t1, t2); } catch (____ ex) { foreach (var inner in ex.InnerExceptions) { Console.WriteLine(inner.Message); } }Cevabı göster
try { await Task.WhenAll(t1, t2); } catch (AggregateException ex) { foreach (var inner in ex.InnerExceptions) { Console.WriteLine(inner.Message); } } -
AggregateException kavramlarını eşleştir
- AggregateException
- Birden çok hatayı toplar
- InnerExceptions
- Alt hatalar koleksiyonu
- Flatten()
- İç içeyi düzleştirir
- InnerException
- İlk alt hata
-
AggregateException ne zaman oluşur?
- Yalnızca tek bir hata fırlatıldığında
- Async void metotlarda
- Task.Run ile CPU işi yaparken
- Birden çok task paralel hata verdiğinde (örn. WhenAll)
Cevabı göster
Birden çok task paralel hata verdiğinde (örn. WhenAll) — Doğru. AggregateException özellikle WhenAll gibi paralel senaryolarda oluşur.