Özet - Async istisnalar
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
-
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.