Throw zamanlaması
throw ifadesinin await öncesi ve sonrasındaki davranışını öğrenirsin.
Throw zamanlaması
Bir async metot içinde throw deyimi hemen çalışmaz. Hata, dönen Task'a yazılır; await ettiğinde fırlatılır. Yani var t = ThrowAsync(); satırı hatayı fırlatmaz; ancak await t; satırı fırlatır.
Bu, özellikle fire-and-forget senaryolarda dikkatlilik ister: ThrowAsync(); yazıp ignore edersen hata Task'ta birikir ve göz ardı edilir. Hatayı yakalamak için Task'ı await et ya da Exception özelliğini denetle.
Exception fırlatma anı
Hatanın ne zaman fırlatılacağını bilmek hata ayıklamada kritiktir. Async bir metot senkron olarak ilk await'e kadar çalışır. throw deyimi bir await'ten sonra geliyorsa, throw çalıştığında hata Task'a yazılır.
Geri kalan kod (throw'dan sonra) çalışmaz. Gönderen Task'ı await ederse throw fırlatılır; etmezse sessizce birikir. Bu yüzden her zaman Task'ı await et ya da izle.
Uygulama Throw ve catch
static async Task ThrowIfNegative(int n) metodunu tanımla. Gövdede await Task.CompletedTask; çağır. Eğer n < 0 ise throw new ArgumentException("Negatif"); fırlat. Main'i static async Task Main yap. try { await ThrowIfNegative(-1); } catch (ArgumentException ex) { Console.WriteLine(ex.Message); } ile hatayı yakala ve mesajı yazdır.
Örnek çözümü göster
ThrowIfNegative gövdesinde await Task.CompletedTask; ve if (n < 0) throw new ArgumentException("Negatif"); yaz. Main'i static async Task Main() yapıp try { await ThrowIfNegative(-1); } catch (ArgumentException ex) { Console.WriteLine(ex.Message); }
Örnek çözüm:
using System;
using System.Threading.Tasks;
class Program
{
static async Task ThrowIfNegative(int n)
{
await Task.CompletedTask;
if (n < 0)
{
throw new ArgumentException("Negatif");
}
}
static async Task Main()
{
try
{
await ThrowIfNegative(-1);
}
catch (ArgumentException ex)
{
Console.WriteLine(ex.Message);
}
}
}
Kendini test et
-
Throw zamanlamasını eşleştir
- var t = ThrowAsync();
- Hata henüz fırlatılmaz
- await t;
- Hata fırlatılır
- throw new Exception();
- Task'a hata yazar
- t.Exception
- Hatayı inceler
-
async metotta throw ne zaman fırlatılır?
- Hemen, throw satırında
- Main başlarken
- Await edildiğinde
- Task.Dispose çağrıldığında
Cevabı göster
Await edildiğinde — Doğru. Async metotlarda throw, await edildiğinde fırlatılır.
-
throw deyimini tamamla
static async Task Fail() { ____ new InvalidOperationException("Hata"); }Cevabı göster
static async Task Fail() { throw new InvalidOperationException("Hata"); }