Derleyici tarafından oluşturulan özel durumları inceleme
- 10 dakika
Özel durumlar .NET çalışma zamanı veya bir programdaki kod tarafından oluşturulur. Özel durum türü, özel duruma neden olan koda bağlıdır.
Derleyici tarafından oluşturulan özel durumlar
Temel işlemler başarısız olduğunda .NET çalışma zamanı özel durumlar oluşturur. Çalışma zamanı özel durumlarının ve hata koşullarının kısa bir listesi aşağıdadır:
-
ArrayTypeMismatchException: Öğenin gerçek türü dizinin gerçek türüyle uyumsuz olduğundan dizinin verilen öğeyi depolayamayacağı durumlarda atılır. -
DivideByZeroException: Bir integral değerini sıfıra bölme girişiminde bulunulduğunda oluşturulur. -
FormatException: Bağımsız değişken biçimi geçersiz olduğunda atılır. -
IndexOutOfRangeException: Bir diziyi dizine ekleme girişiminde bulunulduğunda ve dizin sıfırdan küçük olduğunda veya dizinin sınırlarının dışında kaldığında fırlatılır. -
InvalidCastException: Bir temel türden arabirime veya türetilmiş bir türe açık dönüştürme çalışma zamanında başarısız olduğunda oluşturulur. -
NullReferenceException: Değeri null olan bir nesneye başvurma girişimi yapıldığında fırlatılır. -
OverflowException: Denetlenen bir bağlamda aritmetik bir işlemde taşma meydana geldiğinde oluşturulur.
Derleyici tarafından oluşturulan özel durumlar için kod örnekleri
Aşağıdaki kod örnekleri, derleyici tarafından oluşturulan özel duruma neden olan kodun bir örneğini gösterir.
Dizi Tür Uyuşmazlığı İstisnası (ArrayTypeMismatchException)
Bir dizide yanlış türdeki ArrayTypeMismatchException bir öğeyi depolamaya çalışıldığında bir tür istisnası fırlatılır. Aşağıdaki örnek, bir ArrayTypeMismatchException dize dizisinde sayısal değer depolamaya çalışırken bir özel durum oluşturur.
string[] names = { "Dog", "Cat", "Fish" };
Object[] objs = (Object[])names;
Object obj = (Object)13;
objs[2] = obj; // ArrayTypeMismatchException occurs
DivideByZeroException
Bir tamsayıyı veya Ondalık sayıyı sıfıra bölmeye çalışırken tür DivideByZeroException özel durumu oluşur. Aşağıdaki örnek, tamsayı bölme işlemi gerçekleştirirken bir DivideByZeroException özel durum oluşturur.
int number1 = 3000;
int number2 = 0;
Console.WriteLine(number1 / number2); // DivideByZeroException occurs
Uyarı
Kayan nokta değerini sıfıra bölmek özel bir durum oluşturmaz; IEEE 754 aritmetik kurallarına göre pozitif sonsuzluk, negatif sonsuzluk veya sayı olmayan değer (NaN) ile sonuçlanır.
Biçim Hatası
Bir bağımsız değişkenin biçimi geçersiz olduğunda veya bileşik biçim dizesi iyi biçimlendirilmediğinde tür FormatException özel durumu oluşur. Aşağıdaki örnek, bir dizeyi tamsayıya FormatException dönüştürmeye çalışırken bir özel durum oluşturur.
int valueEntered;
string userValue = "two";
valueEntered = int.Parse(userValue); // FormatException occurs
Dizin Dışı Aralık Hatası
Bir dizinin veya koleksiyonun sınırlarının dışındaki bir dizine sahip bir öğeye erişmeye çalışıldığında IndexOutOfRangeException türünde bir özel durum oluşturulur. Aşağıdaki örnek, dizinin son öğesini dizinin IndexOutOfRangeException son öğesine values1 atamaya çalışırken bir values2 özel durum oluşturur.
int[] values1 = { 3, 6, 9, 12, 15, 18, 21 };
int[] values2 = new int[6];
values2[values1.Length - 1] = values1[values1.Length - 1]; // IndexOutOfRangeException occurs
InvalidCastException
Geçersiz bir tür dönüştürme veya açık dönüşüm denenirken InvalidCastException türünde bir özel durum ortaya atılır. Aşağıdaki örnek, string türünde bir InvalidCastException'i object değişkenine dönüştürmeye çalışırken bir int fırlatır.
object obj = "This is a string";
int num = (int)obj;
NullReferenceException (Boş Referans Hatası)
Değeri null olan bir türün üyesine erişmeye çalışılırken tür NullReferenceException özel durumu atılır. İki örnek gösterilmiştir. İlk örnekte, null dizinin bir öğesine erişmeye çalışıldığında bir NullReferenceException fırlatılır. İkinci örnek, null bir dizenin yöntemine erişmeye çalışıldığında bir NullReferenceException atar.
int[] values = null;
for (int i = 0; i <= 9; i++)
values[i] = i * 2;
string? lowCaseString = null;
Console.WriteLine(lowCaseString.ToUpper());
OverflowException
Aritmetik bir işlem hedef veri türü aralığının dışında bir sonuç atamaya çalıştığında tür özel durumu OverflowException oluşur. Aşağıdaki örnek, 400 OverflowException değerini decimal değişkenine dönüştürmeye çalışırken bir byte özel durumu fırlatır.
decimal x = 400;
byte i;
i = (byte)x; // OverflowException occurs
Console.WriteLine(i);
Özet
Bu ünitede hatırlamanız gereken birkaç önemli şey şunlardır:
- Bir işlem başarısız olduğunda .NET Runtime bir exception fırlatır.
- Özel durum türü, özel duruma neden olan koda bağlıdır.
- Uygulamanız çalışma zamanı istisnalarını yakalamalıdır.