async try/catch
async metotlarda try/catch ile istisna yakalamayı öğrenirsin.
async try/catch
Bir async metot içinde try/catch kullanmak senkron kodla aynıdır. await çağrısını try bloğuna alırsın; hata oluşursa catch bloğu çalışır. Örnek: try { await DoWork(); } catch (Exception ex) { ... }.
Önemli: hatayı yakalamak için mutlaka await kullan. Eğer DoWork()'u await etmeden çağırırsan, dönen Task'ta biriken hata göz ardı edilir ve başka bir yerde patlar.
Exception yakalama
Async bir metot hata fırlattığında bu hata dönen Task'a yazılır. await ile beklediğinde Task hata vermişse, await hatayı yeniden fırlatır; böylece catch bloğu onu yakalar. Bu yüzden async hata akışı bekleyişle başlar.
Hata türüne göre birden çok catch yazabilirsin: catch (InvalidOperationException ex) ya da genel catch (Exception ex). En özel tür önce gelmelidir; yoksa genel catch hepsini yakalar.
Uygulama async try/catch ile hatayı yakala
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 FailAsync(); } catch (Exception ex) { Console.WriteLine(ex.Message); } ile hatayı yakala ve mesajı 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 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 FailAsync();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
Kendini test et
-
async try/catch nasıl kurulur?
- Sadece Main'de
- await çağrısını try bloğuna sararak
- async anahtar kelimesinden önce
- Task.Run çağrısından sonra
Cevabı göster
await çağrısını try bloğuna sararak — Doğru. await çağrısını try bloğuna sarmak hatayı yakalar.
-
try bloğunu tamamla
static async Task Run() { ____ { await DoWork(); } catch (Exception ex) { Log(ex); } }Cevabı göster
static async Task Run() { try { await DoWork(); } catch (Exception ex) { Log(ex); } } -
await etmeden çağırırsan hata ne olur?
- Hata hemen fırlatılır
- Hata hiç oluşmaz
- Hata Task'ta birikir; başka yerde patlayabilir
- Hata otomatik olarak yakalanır
Cevabı göster
Hata Task'ta birikir; başka yerde patlayabilir — Doğru. await etmeden çağrıdaki hata Task'ta birikir; sonra göz ardı edilir ya da patlar.