CodeBlanks Logo Icon CodeBlanks

AggregateException

C# kursu · İleri seviye · Ders 14/83

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

  1. 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); } }
  2. 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
  3. 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.

İleri seviye bölümündeki tüm dersler