C# Exception Handling | “throw” Kullanımı – Bölüm 1

csharplogo

C# gibi modern dillerde, alınan hatalar genellikle Exception‘lar ile modellenir. Bu hataların sebebi genel olarak beklenmeyen sorunlardır. Uygulamalar, hatayı anlaşılır şekilde handle etmek için Exception Handling yapılarını kullanırlar. C# Exception Handling serisinin ilk bölümünde “throw” kullanımını örnekleriyle birlikte inceleyeceğiz.

Exception’lar kötüye kullanılması kolay olan yapılardan birisidir. Aynı zamanda yanlış kullanımı söz konusu olduğunda Exception Handling yapıları oldukça tehlikelidir. Uygulamalarda gerekli bir Exception handle edilmemiş olabilir ya da geçerli bir sebep olmadan throw edilmiş olabilir. Bu gibi durumlar hem son kullanıcı için hem de hatayla ilgili analiz yapan kişiler için anlam karmaşıklığına sebep olur. Bir hata anında çözüm için dump analizlerine, environment üzerinde bulunan tüm log kayıtların incelenmesine kısaca zaman kaybına yol açabilir. Oysaki Exception Handling doğru şekilde implement edildiğinde uygulamalara can veren, kullanıcılar ile konuşmasını mümkün kılan, karşısındakine derdini anlatmasını sağlayan çok önemli yapılardan birisidir.

Resim – 1

Anlatımlar için kullanılacak senaryo Resim – 1’de görülmektedir. Basit bir hiyerarşi ile ConsoleApp üzerinden LayerFirst‘e ilk call yapılmaktadır. LayerFirst ise LayerSecond’a ikinci bir call yapmaktadır. LayerSecond’da bulunan code bloğu içerisinde DevideByZeroException’ı bulunmaktadır. Artık farklı throw kullanımlarını incelemeye başlayabiliriz.

‘throw ex;’ Kullanımı

İlk örneğimizde SecondLayer’da bulunan DevideByZeroException ‘throw ex;’ ile fırlatılmıştır. Fakat senaryoda Exception LayerSecond’da olmasına rağmen Source olarak LayerFirst görülmektedir. Ayrıca StackTrace incelendiğinde LayerFirst sonrası call’lar görülmemektedir. (Resim – 2)

Resim – 2

‘throw ex;’ Kullanımının Dezavantajları:

  • ‘throw ex;’ kullanımı ile önceki StackTrace bilgisi kaybolur.
  • Source bilgisi doğru noktayı refere etmez.
  • Root Cause analizi ve Troubleshooting oldukça zorlaşır.
  • Exception’ın daha anlamlı olması için manipülasyon gerekir.

 

‘throw;’ Kullanımı

İkinci örneğimizde SecondLayer’da bulunan DevideByZeroException ‘throw;’ ile fırlatılmıştır. Source olarak LayerSecond görülmektedir. Ayrıca StackTrace incelendiğinde Call Pipeline’ı boyunca oluşan tüm call’lar görülmektedir. (Resim – 3)

Resim – 3

‘throw;’ Kullanımının Avantajları:

  • ‘throw;’ ile önceki StackTrace bilgisi kaybolmaz.
  • Source bilgisi Exception’ın gerçekleştiği noktayı refere eder.
  • Root Cause analizi ve Troubleshooting kolaydır.

 

‘throw new CustomException();’ Kullanımı

User-defined Exception’lar için best practices olarak önerilen; eğer Predefined Exception Type’lar ihtiyacı karşılıyorsa, uygun olan Exception Type kullanılmalıdır.

  • ArgumentException
  • ArgumentNullException
  • ArgumentOutOfRangeException
  • AccessViolationException
  • IndexOutOfRangeException
  • InvalidOperationException

Eğer karşılamıyorsa, Exception sınıfından yeni bir Class türetilmeli ve Custom Exception Class’ı için 3 adet Constructor oluşturulmalıdır.

  • CostumException( )
  • CustomException(String)
  • CustomException(String, Exception)

Custom Exception’lar uygulama içerisinde kullanılırken çok dikkatli olunmalıdır. Yanlış kullanımlar daha anlamsız Exception’lara sebep olabilir.

Avantajları:

  • Technical Exception ile Business Exception’ların birleştirilmesine olanak sağlar.
  • Business ve Technical Exception detayları bir arada olduğu için Root Cause analizi ve Troubleshooting daha anlamlı ve kolaydır.

Dezavantajları:

  • StackTrace ve Source bilgisi Exception üzerinde kaybolabilir ya da yanlış noktayı refere edebilir.

 

‘throw’ kullanımlarını örnekleriyle birlikte inceledik. Umarım sizler için de faydalı bir paylaşım olmuştur.

Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar      

www.mshowto.org  

https://docs.microsoft.com/en-us/dotnet/standard/exceptions/best-practices-for-exceptions

https://docs.microsoft.com/en-us/dotnet/standard/exceptions/how-to-create-user-defined-exceptions

TAGs: C#, Exception Handling, Exception, User-defined Exceptions, Custom Exception, throw, try/catch, .Net Framework, .Net 5.0, Visual Studio 2019, Visual Studio

Yazı gezinmesi

Mobil sürümden çık