Merhabalar, C# InvalidCastException Nedir? yazım ile C# eğitim setime ve Exceptions yazılarıma devam ediyorum. Bu ders InvalidCastException özel durumunu hakkında bilgi, nasıl oluştuğu ve önlemleri hakkında olacak
Bir çok excepiton konusunu anlatmıştım ama bu excepiton gözümden kaçmış. Aslında çok fazla ortaya çıkan bu hatayı nasıl gözden kaçırdığıma inanamıyorum. Neyse geç olsun güç olmasın değil mi?
C# InvalidCastException Nedir?
Devralma : Object > Excepiton > SystemException > InvalidCastException
C# InvalidCastException Nedir?
InvalidCastException, geçersiz atama ve açık dönüşüm işlemlerinde ortaya çıkan bir özel durumdur. Bir türün başka bir türe dönüştürülmesi işlemi desteklenmiyor ise bu özel durum ortaya çıkar. Örnek vermek gerekirse, bir button nesnesi bir label nesnesine dönüştürülemez. Bu işlem yapılmaya çalışıldığında InvalidCastException özel durumu ortaya çıkar.
Bu noktada bakıldığında InvalidCastException özel durumu yazılımcının yazılım hatalarından ortaya çıkan bir özel durumdur. Bu sebeple InvalidCastException özel durumu alınan bir kod bloğunda hemen Try Catch kullanmak yerine hatanın sebebinin araştırılması düzeltilmesi daha iyidir.
BİLGİ: Bu tarz dönüşümleri bir döngü içerisinde yapıyorsanız, döngünün kendisini try catch içine almalısınız. InvalidCastException özel durumu aldığınızda döngüyü kırılır ve yapılmasını istediğiniz işlemlerin yarım kalmasına sebep olabilir. Bu sebeple hatanın üzerini örtmek değil çözümü yoluna gidilmesi daha makuldur.
Olabilecek Tüm Sebepleri
Daha iyi anlaşılabilmesi için daha fazla örnekleme yapmak istiyorum.
Yukarıda verdiğim örneği he yerde kullanamayabilirsiniz. Ancak örneğin bir char değerini bir datetime değerine dönüştürmeye (Convert) çalışırsanız yine InvalidCastException özel durumu ortaya çıkar. Tabi bu diğer tür dönüşümleri içinde geçerlidir.
- Değeri “1” olan STRING değişkenin, BOOL yada INT türüne dönüşümü desteklenir.
- Değeri “True” olan STRING değişkenin BOOL türüne dönüşümü desteklenir.
- Değeri “1” olan CHAR değişkeninin, BOOL, INT yada STRING türüne dönüşümü desteklenir.
- Değeri “2020.04.08” olan STRING değişkenin, DATETIME türüne dönüşümü desteklenir.
Yukarıda verdiğim örnekler baz alınarak bazı türler, sahip olduklara değerlere göre diğer türlere dönüşümleri desteklenir. Temel olarak bütün türlerin, STRING türüne dönüşü desteklenir. Bu noktada Değişkenler ve Convert İşlemleri hakkındaki yazılarımı inceleyebilirsiniz.
C# InvalidCastException Örnekleri
Şimdi bu konu hakkında birkaç örnek yapalım. Githup projeme eklediğim derste de görebilirsiniz.
Öncelikle hatalı ve doğru bir dönüşüm yapalım.
// bu hatalı bir dönüşüm. try { char c = 'C'; DateTime dt = Convert.ToDateTime(c); } catch (InvalidCastException ex) { txt_cikti.Text += ex.GetType().Name + ":" + ex.Message + Environment.NewLine; } // bu doğru bir dönüşüm try { int i = 1; bool bl = Convert.ToBoolean(i); } catch (InvalidCastException ex) { txt_cikti.Text += ex.GetType().Name + ":" + ex.Message + Environment.NewLine; }
Burada Try Catch kullanmamın sebebi, (projeyi indirenler bilir) hata çıktısını bir textbox’ta göstermek istediğim içindir.
Yukarıdaki örneklere baktığımızda bir hatalı ve bir doğru dönüşüm görebiliyoruz. Üst kısımda verdiğim örneklere göre yazılan kodlardır. Şimdi de formdaki tüm buttonlara bir işlem yapmamız gerektiği senaryosunda InvalidCastException özel durumu gönderecek kodlara bakalım.
// Bu örnek doğru bir örnek değildir. Sadece hatanın sebebini görmenizi istediğim için kullanıyorum. try { // formdaki bütün buttonlara bir işlem yapmak istiyorum foreach (Button item in this.Controls) { // formdaki tüm itemlere bir button gibi davranmasını istedik // aslında bir convert yani dönüşüm yapmak istiyoruz. Button b = (Button)sender; // tüm butonların text özelliğine +1 ifadesinin eklenmesini istedim. b.Text = b.Text + "+1"; } } catch (InvalidCastException ex) { // ama bu kodlarda bir hata alacağım. // çünkü formda dönüşümü desteklenmeyecek başka nesneler var. // txt_cikti adındaki nesne bir textbox olduğundan dolayı // bir button gibi davranamaz bu yüzden InvalidCastException hatası alırız. txt_cikti.Text += ex.GetType().Name + ":" + ex.Message + Environment.NewLine; // Ayrıca tüm döngüyü try içine aldığımızdan ilk hatada döngü kırılacak ve // işlem tamamlanmadan kesilecek. }
Kod bloğu üzerinde açıklamalar zaten var ve yeterince açık olduğunu düşünüyorum… Bu kodlar yazıldığı yere göre doğru değildir. Yani bir önceki dersim olan C# Sanal Klavye dersini incelerseniz ne demek istediğimizi anlayabilirsiniz.
C# InvalidCastException Nedir? dersimiz de bu kadardı arkadaşlar. Bu yazım için farklı bir kapak fotosu kullandım. Nasıl olmuş sizce? :)
Tüm Exceptions derslerime bağlantıdan ulaşabilirsiniz.
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız.
Derslerime özel olarak hazırladığım Github Projeme buradan ulaşabilirsiniz… Bu dersim Github projemde yerini almıştır. Tüm Exception adı altında eklediğim dersleri Github projeme ekleyeceğim.
Sağlıcakla ve takipte kalın.
Yorumlar (1)