C#
throw
throw ile kendi istisnalarını fırlatmayı öğrenirsin.
throw ile istisna fırlatma
throw anahtar kelimesi bir istisna fırlatır. Bu, programda beklenmedik ya da geçersiz bir durum oluştuğunda durumu bildirmenin yoludur. Genellikle throw new ExceptionType("mesaj") biçiminde kullanılır.
Örnek: if (age < 0) throw new ArgumentException("Negatif yaş"); satırı, age negatif olduğunda yeni bir istisna oluşturur ve fırlatır. Çağıran kod bu istisnayı try/catch ile yakalayabilir; aksi halde program çöker.
Yeniden fırlatma
Bir catch bloğu içinde yakalanan istisnayı aynı blokta işlemek yerine dışarıya iletmek istersen throw; (çıplak throw) kullanırsın. Bu, istisnayı özgün yığın izi (stack trace) ile koruyarak yeniden fırlatır; yani hatanın kaynağı kaybolmaz.
Örnek: catch (Exception) { LogError(); throw; } yapısında önce hata kaydedilir, sonra istisna üst çağrıcıya iletilir. throw; yerine throw ex; yazarsan yığın izi kesilir ve hata kaynağı bu satıra kayar; bu genellikle istenmeyen bir durumdur.
Mesajlı istisna oluşturma
İstisna fırlatırken bir mesaj vermek, hatanın nedenini anlaşılır kılar. new Exception("mesaj") biçiminde oluşturduğun istisna, Message özelliği üzerinden bu mesajı taşır. Hata yakalandığında bu mesajı kullanıcıya gösterebilir ya da günlüğe kaydedebilirsin.
Örnek: throw new Exception("Veri eksik"); satırı, mesajı "Veri eksik" olan bir istisna fırlatır. catch (Exception ex) bloğunda ex.Message bu dizeyi verir. Mesaj ne kadar açıklayıcı olursa, hata ayıklama o kadar kolay olur.
Uygulama Doğrula ve fırlat
try bloğu içinde if (age < 0) koşuluyla throw new ArgumentException("Negatif yaş"); fırlat. Aksi halde Console.WriteLine(age); ile yaş'ı yazdır. catch (ArgumentException ex) bloğu içinde Console.WriteLine(ex.Message); ile mesajı yazdır.
Örnek çözümü göster
try bloğunda if (age < 0) throw new ArgumentException("Negatif yaş"); else Console.WriteLine(age); yaz.
Örnek çözüm:
using System;
class Program
{
static void Main()
{
int age = -5;
try
{
if (age < 0)
{
throw new ArgumentException("Negatif yaş");
}
Console.WriteLine(age);
}
catch (ArgumentException ex)
{
Console.WriteLine(ex.Message);
}
}
}
Kendini test et
-
throw; ile throw ex; arasındaki fark?
catch (Exception ex) { throw; } // A
catch (Exception ex) { throw ex; } // B
- throw ex yığın izini korur
- throw; yığın izini keser
- İkisi aynıdır
- throw; yığın izini korur, throw ex keser
Cevabı göster
throw; yığın izini korur, throw ex keser — Doğru! throw; özgün yığın izini korur; throw ex keser.
-
Yeni istisna fırlat
if (age < 0) {
____ new ArgumentOutOfRangeException("age");
}
Cevabı göster
if (age < 0) {
throw new ArgumentOutOfRangeException("age");
}
-
İfadeyi açıklamasıyla eşleştir
- throw;
- Yeniden fırlat
- throw new Exception()
- Yeni hata
- throw ex;
- Yığın izini keser
Sıradaki ders: Exception sınıfı