23 Aralık 2022 Cuma

Exception

 Exception hangding de yapılan hatalar

1: Exceptionu Yakalamamak( Not Catching Exceptions

Yapılan ilk büyük hata kod içerisindeki Exceptionları yakalamamaktır.
Geliştiriciden kaynaklı pek çok exception olsa da (NullReferenceException, IndexOutOfRangeException, ArgumentException, InvalidOperationException, vb.), hiçbir geliştiricinin oluşmasını engelleyemeyeceği exceptionlar da vardır.

Örneğin, dosyalarla çalışırken gerekli dosya mevcut olmayabilir, kullanıcının dosyayı açma izni olmayabilir, dosya bozuk veya kilitli olabilir veya sabit sürücüde disk alanı bitebilir. Tüm bu sorunlar, developerların oluşmasını engellemesi pek de mümkün olmayan exceptionlara örnektir.

  • Connecting to external APIs
  • Connecting to database
  • Executing SQL statements
  • Working with operating system
  • Requesting resources over the internet 
  • Working with hardware devices such as cameras or microphones
Tüm bu senaryolar, Yazılımcının meydana gelebilecek belirli bir özel durum için bir catch yan tümcesi ekleyerek hesaba katması gereken şeylerdir.


Yukarıdaki gibi yazmak yerine;



Bu şekilde kodunuz yalnızca beklenen senaryolar için doğru şekilde çalışmakla kalmaz, aynı zamanda sorunları incelikle kurtarabilir ve son kullanıcıya iletebilir.

2:Exception Fırlatmamak( Not Throwing Exceptions )
Exceptionları yakalamamak(catch etmemek) kırılgan bir uygulamaya yol açabilirken, Exceptionları fırlatmamak(throw)  da bir hata akışına yol açabilir.

Kodunuzun güvenilir bir şekilde iyi bir sonuç elde edemediği bir senaryo ile karşılaşırsanız, bir exception oluşturmak, daha sonra kodunuzun kararlarının sonuçları arasında gezinmek yerine bu kötü senaryoyu hemen keşfetmenize yardımcı olabilir.

3: Catch Exception and Throwing Exception
Genel bir Exception yakalamak yada geriye Genel bir throw exception göndermek doğru değildir.


Yukarıdaki kod , sorunları erken tespit eder ve bu sorunları bir Exceptionda ortaya çıkarır. Bu iyi bir şeydir.

Fakat  bu kod, ArgumentOutOfRangeException veya InvalidOperationException gibi belirli bir exception oluşturmaz. Bunun yerine, bu kod, Exception sınıfının bir örneğini fırlatır.

Genel bir exception fırlatmak yerine, yukarıdaki kodun bir catch bloğu tarafından özel olarak yakalanıp işlenebilecek daha spesifik bir exception atmış olması gerekirdi.


 4: Incorrectly Rethrowing Exceptions

İşte bu kod doğru gibi görünüyor. Ancak, yukarıdaki throw ex sözdizimi kötü bir uygulamadır. Yukarıdaki hatanın bu metodu çağıran yer tarafından yakalanmasını sağlamaktan başka bir şey yapmıyor.

Bununla birlikte, bu kod, exceptionun nerede meydana geldiğine ilişkin olarak önceden sahip olduğumuz herhangi bir önceki bağlamı da kaldırır. Exceptionun call stacki, exceptionun orijinal olarak meydana geldiği yerde değil, catch bloğunun içinde başlayacaktır.

yukarıdaki yapı güncellenirse;

Exceptionun call stackini  değiştirmeden yukarı doğru yayılmasına sağlamış oluyoruz. Böylece  Exceptionu handle eden kod için exceptionun tüm ayrıntılarını korumuş olacağız.

5: Catching Exceptions in the Wrong Place
Exceptionları  yakalamak için temel kurallarımdan biri, exceptionları yalnızca onlardan doğru bir şekilde kurtarabileceğiniz yerlerde yakalamaktır.

Exception oluşturabileceğini bildiğimiz bir kod satırında try/catch yazma mecburiyetimiz yoktur.

Bunun yerine, içinde bulunduğunuz metodu call eden kodun, istisnai durumlara tepki vermek için daha iyi donanımlıysa try/catch bloğunu oraya koyabiliriz.

6: Using Exceptions for Flow Control
- Exception, gerçekten sıra dışı olan ve yalnızca nadir durumlarda ortaya çıkabilen, program yürütmenin normal bir parçası olmayan bir şeydir.
- Sonuç olarak özetlenen şey şudur: İstisnalar gerçekten istisnai olmalıdır.

İstisnaların kullanımına iyi örnekler:
  • A class requires a parameter that has a valid value and was given an invalid one
  • The system needs to talk to the database, but the database appears to be offline
  • The file the user is trying to load is not in the correct format

7: Not Using Custom Exceptions
Dotnet, aşağıdakiler de dahil olmak üzere çeşitli durumlarda kullanıma uygun çok çeşitli istisna türleri sunar:
  • ArgumentException
  • InvalidOperationException
  • FormatException
Ancak, bir istisna atmanız gereken ve built-in exceptionların hiçbirinin mantıklı olmadığı bazı yerler vardır.

Bu durumlarda, özel istisnanızı temsil eden yeni bir sınıf oluşturmak ve Exception sınıfından  miras almak mantıklı olabilir.

8: Not Providing Enough Exception Details
Çoğu durumda bir istisna atmak yeterli değildir. İstisnalar yakalandığında onlara tepki verebilmemiz gerekir.

İstisnalara tepki vermek genellikle şunları gerektirir:
  • İstisnanın nerede meydana geldiğini bilmek (the stack trace)
  • İstisnanın tam type ını bilmek (the GetType method helps with this)
  • İstisna için yararlı bir mesaja sahip olmak
  • Meydana gelen istisnaya özel ek ayrıntılara sahip olmak
Aşağıdaki kod, bir istisna oluştururken yeterli bilgi sağlamamanın bir örneğidir:



Bu kod, amountun pozitif olmadığı, ancak onu yakalayan herhangi bir kodun son kullanıcıya bilgi görüntülemek veya hata loguna uygun bir mesaj kaydetmek için ilgili ayrıntılara sahip olmadığı durumları başarıyla ele alır.

Daha iyi bir uygulama şöyle olacaktır:


Bu durumda, geçersiz parametrenin adını, o parametrenin değerini ve faydalı bir hata mesajı sağlıyoruz.


REFERENCE

Hiç yorum yok:

Yorum Gönder