CodeBlanks Logo Icon CodeBlanks

Özet - Async istisnalar

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

try/catch, AggregateException ve when'i birleştirerek sağlam bir async sarmalayıcı yazarsın.

Özet - Async istisnalar

Bu grupta async hata yönetiminin temellerini öğrendin: async try/catch senkron gibi çalışır; hatayı yakalamak için await şart. AggregateException paralel hataları toplar; Task.Exception hatayı inceler. throw hemen değil, await edildiğinde fırlatılır.

Son olarak when koşulu ile catch bloklarını filtrelemeyi öğrendin. Şimdi tüm bunları birleştiren bir uygulama yazacağız.

Uygulama try/catch + WhenAll birleştir

static async Task FailAsync() metodunu tanımla. Gövdede await Task.CompletedTask; ve throw new InvalidOperationException("Hata"); yaz. Main'i static async Task Main yap. try { await Task.WhenAll(FailAsync(), FailAsync()); } catch (Exception ex) { Console.WriteLine(ex.Message); } ile ilk hatanın mesajını yazdır.

Örnek çözümü göster
FailAsync gövdesinde await Task.CompletedTask; ve throw new InvalidOperationException("Hata"); yaz. Main'i static async Task Main() yapıp try { await Task.WhenAll(FailAsync(), FailAsync()); } catch (Exception ex) { Console.WriteLine(ex.Message); }
Örnek çözüm:
using System;
using System.Threading.Tasks;

class Program
{
    static async Task FailAsync()
    {
        await Task.CompletedTask;
        throw new InvalidOperationException("Hata");
    }

    static async Task Main()
    {
        try
        {
            await Task.WhenAll(FailAsync(), FailAsync());
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

İpuçları

Birkaç ipucu: async hata yakalamada her zaman await kullan. AggregateException'ı InnerExceptions ile gez. Task.Exception ile bir Task'ın hatasını await etmeden incele.

Exception filtreleme için when koşulunu kullan; yan etkilerden kaçın. Birden çok paralel hata için WhenAll'ün AggregateException'ına bak. Fire-and-forget'ten kaçın; her Task'ı await et ya da izle.

Uygulama Mini uygulama: Geçersiz girdi

static async Task<int> ParseOrThrow(string s) metodunu tanımla. Gövdede await Task.CompletedTask; çağır. int.TryParse(s, out int n) true ise return n;, değilse throw new FormatException("Geçersiz");. Main'i static async Task Main yap. try { int n = await ParseOrThrow("abc"); } catch (FormatException ex) { Console.WriteLine(ex.Message); } ile hatayı yakala ve yazdır.

Örnek çözümü göster
ParseOrThrow gövdesinde await Task.CompletedTask; if (int.TryParse(s, out int n)) return n; else throw new FormatException("Geçersiz"); yaz. Main'i static async Task Main() yapıp try { int n = await ParseOrThrow("abc"); } catch (FormatException ex) { Console.WriteLine(ex.Message); }
Örnek çözüm:
using System;
using System.Threading.Tasks;

class Program
{
    static async Task<int> ParseOrThrow(string s)
    {
        await Task.CompletedTask;
        if (int.TryParse(s, out int n))
        {
            return n;
        }
        throw new FormatException("Geçersiz");
    }

    static async Task Main()
    {
        try
        {
            int n = await ParseOrThrow("abc");
        }
        catch (FormatException ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

Kendini test et

  1. Hatayı yakalamak için ne şart?

    • await kullanmak
    • async void kullanmak
    • Thread.Sleep
    • Task.Delay
    Cevabı göster

    await kullanmak — Doğru. Hatayı yakalamak için await kullanmalısın.

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