Uygulama geliştirirken hatalar meydana gelebilir. Bazen bir dosyayı açmaya çalışırsınız ama dosya başka bir program tarafından kullanılıyordur. Bazen (ki bu daha sık olan) veritabanında olmayan bir değeri çektirdiğinizde “null reference” hatası alabilirsiniz. Belki API’ye istek yapıyorsunuzdur ama istek yaptığınız sunucu cevap vermiyor olabilir. Bu gibi durumların çoğunda ortaya çıkabilecek hataları yönetmek için exception handling (hata yakalama) yapılır.
Exception Handling
C# içerisinde oluşan bir hata bir exception fırlatabilir. Exception nesnesi hata hakkında bilgiler içerir ve bu yapı uygulamada hata kodu döndürme ihtiyacını büyük ölçüde ortadan kaldırır. Eğer bir exception C# içinde yakalanmazsa program sonlanır.
Basit bir EF örneği gösterelim.
using (var context = new AppDbContext())
{
var customer = context.Customers.FirstOrDefault(c => c.Id == 1);
Console.WriteLine(customer.Name);
}
“Id == 1” koşulua uyan bir değer yoksa, “customer” null gelecektir. Dolayısıyla “null” kontrolü yapılmadığı için, “customer.Name” yazıldığında NullReferenceException hatası verecektir.
System.NullReferenceException: Object reference not set to an instance of an object.
at Program.<Main>$(String[] args) in C:\Users\Recep\Program.cs:line 7
Bunu düzeltelim.
try
{
using (var context = new AppDbContext())
{
var customer = context.Customers
.FirstOrDefault(c => c.Id == 1);
Console.WriteLine(customer.Name);
}
}
catch (NullReferenceException ex)
{
Console.WriteLine("Veritabanında değer bulunamadı: " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("Genel bir hata oluştu: " + ex.Message);
}
C#’ta hataları yakalamak için try ve catch bloğu kullanılır. 2. örnekte, birinci örnekteki null reference exception hatasının nasıl yakalanabileceği göstermektedir.
.NET’de tüm exception türleri System.Exception temel sınıfından türemektedir. Ayrıca burada kullanılan bir finally anahtar kelimesi de vardır. finally bloğu, hata oluşsa da oluşmasa da her zaman çalışır. Önce “try” çalışır, en son “finally” bloğu içine girer.
Exception işlerken birden fazla türde hatayı yakalamak mümkündür. İkinci örnekte bunu gösterdim. Ancak bu tür exception handling yöntemi, metotların boyutunu artırabilir ve kodun olması gerektiği kadar temiz görünmemesine neden olabilir. Bu sebeple kendi exception sınıflarınızı oluşturabilirsiniz. Bu daha açık hatalar gösterecektir.
C#’ta özel exception sınıfları oluşturmak mümkün. Bu sınıflar mutlaka System.Exception temel sınıfından türemelidir. Örneğin metot geçersiz bir parametre getirebilir. Hemen bir örnek yapalım.
public void AddCustomer(string customerName)
{
if (string.IsNullOrWhiteSpace(customerName))
{
throw new ArgumentNullException(nameof(customerName), "Kullanıcı adı boş bırakılamaz");
}
Console.WriteLine("Kullanıcı adı belirlendi: " + customerName);
}
.NET’in hazır exception türlerini de kullanarak daha doğru yapı inşaa edilebilir.
Kendi özel exception sınıfınızı da aşağıdaki gibi oluşturup anlamlı hatalar döndürebilirsiniz.
public class CustomerNotFoundException : Exception
{
public CustomerNotFoundException(string message)
: base(message)
{
}
}
public class CustomerService
{
public void GetCustomer(int customerId)
{
var customer = context.Customers.FirstOrDefault(c => c.Id == 1);
if(customer is null)
throw new CustomerNotFoundException($"ID değeri {customerId} olan müşteri bulunamadı");
Console.WriteLine("Müşteri: " + customer.Name);
}
}
Microsoft’un exception için hazırladığı best practice sayfasına bir gözatmayı unutmayın.
Yorum bırakın