Aracılığıyla paylaş


21 Özel Durum

21.1 Genel

C# dilindeki özel durumlar, hem sistem düzeyi hem de uygulama düzeyi hata koşullarını işlemek için yapılandırılmış, tekdüzen ve tür açısından güvenli bir yol sağlar.

21.2 Özel durumların nedenleri

Özel durumlar iki farklı şekilde oluşturulabilir.

  • Bir throw deyim (§13.10.6), hemen ve koşulsuz olarak bir özel durum oluşturur. Denetim, deyimine hiçbir zaman hemen ulaşmaz throw.
  • C# deyimlerinin ve ifadelerinin işlenmesi sırasında ortaya çıkan bazı istisnai koşullar, işlemin normal şekilde tamamlanamadığı belirli durumlarda bir özel durumun ortaya çıkmasına neden olur. Bu şekilde oluşturulabilecek çeşitli özel durumların listesi için bkz . §21.5 .

    Örnek: Payda sıfır olduğunda bir tamsayı bölme işlemi (§12.10.3) bir System.DivideByZeroException oluşturur. son örnek

21.3 System.Exception sınıfı

System.Exception sınıfı, tüm özel durumların temel türüdür. Bu sınıf, tüm özel durumların paylaştığı birkaç önemli özelliğe sahiptir:

  • Message , özel durumun nedeninin insan tarafından okunabilir bir açıklamasını içeren türündeki string salt okunur bir özelliktir.
  • InnerException türündeki Exceptionsalt okunur bir özelliktir. Değeri değilsenull, geçerli özel duruma neden olan özel duruma başvurur. (Yani, geçerli özel durum öğesini işleyen bir catch bloğunda InnerExceptionoluşturuldu.) Aksi takdirde değeri, bu özel durumun başka bir özel durumdan kaynaklanmadığını gösteren değeridir null. Bu şekilde zincirlenmiş özel durum nesnelerinin sayısı rastgele olabilir.

Bu özelliklerin değeri için System.Exceptionörnek oluşturucusunun çağrılarında belirtilebilir.

21.4 Özel durumlar nasıl işlenir?

Özel durumlar bir try deyimle işlenir (§13.11).

Bir özel durum oluşturulduğunda (§21.2), sistem özel durumun çalışma zamanı türü tarafından belirlenen özel durumu işleyebilen en yakın catch yan tümcesini arar. İlk olarak, geçerli yöntem sözcüksel olarak kapsayan bir deyim için aranılır try ve deyiminin try ilişkili catch yan tümceleri sırayla kabul edilir. Bu başarısız olursa, geçerli yöntemi çağıran yöntem, çağrının noktasını geçerli yönteme kapsayan sözcüksel olarak kapsayan try bir deyim için aranılır. Bu arama, aynı sınıftaki bir catch özel durum sınıfını veya atılmakta olan özel durumun çalışma zamanı türünün bir temel sınıfını adlandırarak geçerli özel durumu işleyebilen bir yan tümce bulunana kadar devam eder. Özel catch durum sınıfını adlandırmayan bir yan tümcesi herhangi bir özel durumu işleyebilir.

Eşleşen catch bir yan tümce bulunduktan sonra sistem denetimi yan tümcesinin ilk deyimine aktarmaya catch hazırlanır. Yan tümcesinin catch yürütülmesi başlamadan önce sistem sırayla, özel durumu yakalayandan daha iç içe deyimlerle try ilişkili tüm finally yan tümceleri yürütür.

Eşleşen catch bir yan tümce bulunmazsa:

  • Eşleşen catch yan tümcesi araması statik bir oluşturucuya (§15.12) veya statik alan başlatıcıya ulaşırsa, statik oluşturucunun çağrılmasını tetikleyen noktaya bir System.TypeInitializationException oluşturulur. öğesinin System.TypeInitializationException iç özel durumu, başlangıçta oluşan özel durumu içerir.
  • Aksi takdirde, sonlandırıcı yürütme sırasında bir özel durum oluşursa ve bu özel durum yakalanmazsa, davranış belirtilmez.
  • Aksi takdirde, eşleşen catch yan tümceler için arama başlangıçta iş parçacığını başlatan koda ulaşırsa, iş parçacığının yürütülmesi sonlandırılır. Bu sonlandırmanın etkisi uygulama tanımlıdır.

21.5 Yaygın özel durum sınıfları

Aşağıdaki özel durumlar belirli C# işlemleri tarafından oluşturulur.

Özel Durum Türü Açıklama
System.ArithmeticException ve System.OverflowExceptiongibi System.DivideByZeroException aritmetik işlemler sırasında oluşan özel durumlar için bir temel sınıf.
System.ArrayTypeMismatchException Depolanmış öğenin türü dizinin türüyle uyumsuz olduğundan bir dizideki depo başarısız olduğunda oluşturulur.
System.DivideByZeroException Bir integral değerini sıfıra bölme girişimi gerçekleştiğinde oluşturulur.
System.IndexOutOfRangeException Sıfırdan küçük veya dizinin sınırlarının dışında olan bir dizin aracılığıyla bir diziyi dizine ekleme girişiminde bulunuldu.
System.InvalidCastException Bir temel tür veya arabirimden türetilmiş bir türe açık dönüştürme çalışma zamanında başarısız olduğunda oluşturulur.
System.NullReferenceException Başvuru null , başvurulan nesnenin gerekli olmasına neden olacak şekilde kullanıldığında oluşturulur.
System.OutOfMemoryException Bellek ayırma girişimi (aracılığıyla new) başarısız olduğunda oluşturulur.
System.OverflowException Bir bağlam içindeki checked aritmetik işlem taştığında oluşturulur.
System.StackOverflowException Yürütme yığını çok fazla bekleyen çağrıya sahip olarak tükendiğinde oluşturulur; genellikle çok derin veya ilişkisiz özyinelemenin göstergesidir.
System.TypeInitializationException Statik bir oluşturucu veya statik alan başlatıcı bir özel durum oluşturur ve onu yakalamak için herhangi bir yan tümcesi mevcut olduğunda catch oluşturulur.