Özel durumları ve özel durum işleme işlemini inceleme
- 11 dakika
C# uygulamasındaki çalışma zamanı hataları, özel durumlar adı verilen bir mekanizma kullanılarak yönetilir. Özel durumlar, hem sistem düzeyinde hem de uygulama düzeyinde 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. Özel durumlar .NET çalışma zamanı veya bir uygulamadaki kod tarafından oluşturulur.
Özel durum işleme gerektiren yaygın senaryolar
Özel durum işleme gerektiren çeşitli programlama senaryoları vardır. Bu senaryoların çoğu bir tür veri alımı içerir. Bazı senaryolar bu eğitimin kapsamı dışında kalan kodlama tekniklerini içerse de yine de dikkate değer.
Özel durum işleme gerektiren yaygın senaryolar şunlardır:
Kullanıcı girişi: Kod kullanıcı girişini işlediğinde özel durumlar oluşabilir. Örneğin, giriş değeri yanlış biçimde veya aralık dışında olduğunda özel durumlar oluşur.
Veri işleme ve hesaplamalar: Kod veri hesaplamaları veya dönüştürmeleri gerçekleştirdiğinde özel durumlar oluşabilir. Örneğin, kod sıfıra bölmeye, desteklenmeyen bir türe dönüştürmeye veya aralık dışında bir değer atamaya çalıştığında özel durumlar oluşur.
Dosya giriş/çıkış işlemleri: Kod bir dosyadan okuduğunda veya dosyaya yazdığında özel durumlar oluşabilir. Örneğin, dosya mevcut olmadığında, programın dosyaya erişme izni olmadığında veya dosya başka bir işlem tarafından kullanıldığında özel durumlar oluşur.
Veritabanı işlemleri: Kod bir veritabanıyla etkileşime geçtiğinde özel durumlar oluşabilir. Örneğin, veritabanı bağlantısı kaybolduğunda özel durumlar oluşur, SQL deyiminde söz dizimi hatası oluşur veya kısıtlama ihlali oluşur.
Ağ iletişimi: Kod bir ağ üzerinden iletişim kurarken özel durumlar oluşabilir. Örneğin, ağ bağlantısı kaybolduğunda, zaman aşımı oluştuğunda veya uzak sunucu bir hata döndürdüğünde özel durumlar oluşur.
Diğer dış kaynaklar: Kod diğer dış kaynaklarla iletişim kurarken özel durumlar oluşabilir. Web Hizmetleri, REST API'leri veya üçüncü taraf kitaplıkları çeşitli nedenlerle özel durumlar oluşturabilir. Örneğin, özel durumlar ağ bağlantısı sorunları, hatalı biçimlendirilmiş veriler vb. nedeniyle oluşur.
Özel durum işleme anahtar sözcükleri, kod blokları ve desenler
C# dilinde özel durum işleme, , catchve finally anahtar sözcükleri kullanılarak tryuygulanır. Bu anahtar sözcüklerin her biri ilişkili bir kod bloğuna sahiptir ve özel durum işleme yaklaşımınızdaki belirli bir hedefi karşılamak için kullanılabilir. Örneğin:
try
{
// try code block - code that may generate an exception
}
catch
{
// catch code block - code to handle an exception
}
finally
{
// finally code block - code to clean up resources
}
Uyarı
C# dili, kodunuzun anahtar sözcüğünü kullanarak bir özel durum nesnesi oluşturmasını throw da sağlar. Özel durum oluşturmak için anahtar sözcüğünü throw kullanmayı içeren özel durum işleme senaryoları, Microsoft Learn'de ayrı bir modülde ele alınmıştır.
Kod try bloğu, özel duruma neden olabilecek korumalı kodu içerir. Blok try içindeki kod bir özel duruma neden olursa, özel durum ilgili catch bir blok tarafından işlenir.
Kod catch bloğu, bir özel durum yakalandığında yürütülen kodu içerir. Blok catch özel durumu işleyebilir, günlüğe kaydedebilir veya yoksayabilir. Bir catch blok, herhangi bir özel durum türü oluştuğunda veya yalnızca belirli bir özel durum türü oluştuğunda yürütülecek şekilde yapılandırılabilir.
Kod finally bloğu, özel durum oluşup oluşmadığını yürüten kodu içerir. Blok finally genellikle bir try blokta ayrılan kaynakları temizlemek için kullanılır. Örneğin, bir değişkenin kendisine doğru veya gerekli değerin atandığından emin olun.
C# uygulamasında özel durum işleme genellikle aşağıdaki desenlerden biri veya daha fazlası kullanılarak uygulanır:
- Desen bir
try-catchblok ve ardından birtryveya daha fazlacatchyan tümceden oluşur. Hercatchblok, farklı özel durumlar için işleyicileri belirtmek için kullanılır. - Desen bir
try-finallyblok ve ardından birtryfinallyblok oluşur. Genellikle, birfinallybloğun deyimleri denetim birtrydeyimi bıraktığında çalışır. - Desen,
try-catch-finallyüç özel durum işleme bloğu türünü de uygular. Desen içintry-catch-finallyyaygın bir senaryo, kaynakların bir bloktatryalınması ve kullanılması, olağanüstü durumların bircatchblokta yönetilmesi ve kaynakların bloktafinallyserbest bırakılması veya başka bir şekilde yönetilmesidir.
Özel durumlar kodda nasıl temsil edilir?
Özel durumlar kodda nesneler olarak temsil edilir ve bu da bir sınıfın örneği olduğu anlamına gelir. .NET sınıf kitaplığı, diğer .NET sınıfları gibi kodda erişilen özel durum sınıfları sağlar. Kodda nesne olarak kullanılan bir diğer .NET sınıfı örneği de sınıfıdır Random (rastgele sayılar oluşturmak için kullanılır).
Daha kesin olarak, özel durumlar, sonunda 'den System.Exceptiontüretilen sınıflarla temsil edilen türlerdir. öğesinden Exception türetilen bir özel durum sınıfı, özel durum türünü tanımlayan bilgileri ve özel durumla ilgili ayrıntıları sağlayan özellikleri içerir. Bu modülün ilerleyen bölümlerinde sınıfın Exception daha ayrıntılı bir incelemesi yer alır.
Bir sınıfın çalışma zamanı örneği genellikle nesne olarak adlandırılır, bu nedenle özel durumlar genellikle özel durum nesneleri olarak adlandırılır.
Uyarı
Bazen birbirinin yerine kullanılmalarına rağmen, sınıf ve nesne farklı şeylerdir. Sınıf bir nesne türünü tanımlar, ancak nesnenin kendisi değildir. Nesne, bir sınıfı temel alan somut bir varlıktır.
Özel durum işleme işlemi
Bir özel durum oluştuğunda, .NET çalışma zamanı özel durumu işleyebilen en catch yakın yan tümceyi arar. İşlem, özel durumun oluşturulmasına neden olan yöntemle başlar. İlk olarak, özel duruma neden olan kodun bir try kod bloğu içinde olup olmadığını görmek için yöntemi incelendi. Kod kod bloğunun içindeyse try , catch deyimiyle try ilişkili yan tümceler sırayla kabul edilir.
catch Yan tümceler özel durumu işleyemiyorsa, geçerli yöntemi çağıran yöntem aranılır. Yöntem çağrısının (ilk yönteme) bir try kod bloğu içinde olup olmadığını belirlemek için bu yöntem incelendi. Çağrı bir try kod bloğunun içindeyse, ilişkili catch yan tümceler dikkate alınır. Bu arama işlemi, geçerli özel durumu işleyebilen bir catch yan tümce bulunana kadar devam eder.
Özel durumu işleyebilen bir catch yan tümce bulunduktan sonra, çalışma zamanı denetimi bloğun ilk deyimine catch aktarmaya hazırlanır. Ancak, bloğun catch yürütülmesi başlamadan önce çalışma zamanı, arama sırasında bulunan deyimlerle try ilişkili tüm finally blokları yürütür. Birden finally fazla blok bulunursa, özel durumun atılması için koda en yakın olandan başlayarak sırayla yürütülürler.
Özel durumu işlemek için herhangi catch bir yan tümce bulunamazsa, çalışma zamanı uygulamayı sonlandırır ve kullanıcıya bir hata iletisi görüntüler.
Bir desenin içinde try-catch iç içe yerleştirilmiş bir try-finally desen içeren aşağıdaki kod örneğini göz önünde bulundurun:
try
{
// Step 1: code execution begins
try
{
// Step 2: an exception occurs here
}
finally
{
// Step 4: the system executes the finally code block associated with the try statement where the exception occurred
}
}
catch // Step 3: the system finds a catch clause that can handle the exception
{
// Step 5: the system transfers control to the first line of the catch code block
}
Bu örnekte aşağıdaki işlem gerçekleşir:
- Yürütme, dış
trydeyiminin kod bloğunda başlar. - İç
trydeyiminin kod bloğunda bir özel durum oluşturulur. - Çalışma zamanı dış
trydeyimiyle ilişkili yan tümceyi bulurcatch. - Çalışma zamanı denetimi kod bloğunun ilk satırına
catchaktarmadan önce içtrydeyimiyle ilişkili yan tümcesini yürütürfinally. - Çalışma zamanı daha sonra denetimi kod bloğunun ilk satırına
catchaktarır ve özel durumu işleyen kodu yürütür.
Bu basit örnekte iç içe ve try-catchtry-finally desenler tek bir yöntem içinde yer alır, ancak diğer yöntemleri çağıran yöntemler arasında birden çok try-catch ve try-finally desen yayılabilir.
Özel durum işleme ve çağrı yığını
Özel durum işleme ve özel durum işleme işlemi hakkında bilgi edindiğinizde genellikle "çağrı yığını geri alınıyor" terimini görürsünüz. Bu terimi anlamak için çağrı yığınını ve kod yürütme sırasında yöntem çağrılarının "yığınını" izlemek için nasıl kullanıldığını anlamanız gerekir.
Çağrı yığınını bir bloklar kulesi gibi düşünebilirsiniz. Bir kule inşa ederken, sadece bir blokla başlarsınız. Kuleye her blok eklediğinizde, mevcut blokların üzerine yerleştirirsiniz. Uygulamanız hata ayıklayıcıda çalışmaya başladığında, uygulamanızın giriş noktası çağrı yığınına eklenen ilk katmandır (kulenin ilk bloğu). Bir yöntem başka bir yöntemi her çağırışında, yeni yöntem yığının en üstüne eklenir. Kodunuz bir yöntemden çıktığında, yöntemi çağrı yığınından kaldırılır.
Uyarı
Konsol uygulaması için, uygulamanızın giriş noktası en üst düzey deyimleridir. Visual Studio Code çağrı yığınında bu giriş noktası yöntemi olarak Main adlandırılır.
Çağrı yığınını geri alma, bir C# programı hatayla karşılaştığında .NET çalışma zamanının kullandığı işlemdir. Az önce incelediğiniz işlemle aynı işlemdir.
Blok kulesi benzetmesine geri döndüğünüzde, kuleden bir bloğu kaldırmanız gerektiğinde, üstten başlarsınız ve ihtiyacınız olana ulaşana kadar her bloğu kaldırırsınız. Bu işlem, yığındaki her çağrı katmanının kuledeki bir blok gibi olduğu çağrı yığınını geri alma işleminin çalışma şekline benzer. Çalışma zamanının çağrı yığınını geri alması gerektiğinde, yukarıdan başlar ve ihtiyaç duyduğuna ulaşana kadar her çağrı katmanını kaldırır. Bu durumda, ihtiyaç duyduğu çağrı katmanı, oluşan özel durumu işleyebilen bir catch yan tümcesine sahip olan yöntemdir.
Özet
Bu ünitede hatırlamanız gereken birkaç önemli şey şunlardır:
- Özel durum işleme gerektirebilecek yaygın senaryolar kullanıcı girişi, veri işleme, dosya G/Ç işlemleri, veritabanı işlemleri ve ağ iletişimidir.
- C# dilinde özel durum işleme, ,
catchvefinallyanahtar sözcükleri kullanılaraktryuygulanır. Her anahtar sözcüğün belirli bir amaca hizmet eden ilişkili bir kod bloğu vardır. - Özel durumlar türler olarak temsil edilir ve .NET'teki sınıfından
System.Exceptiontüretilir. Özel durumlar, özel durum türünü tanımlayan bilgiler ve ek ayrıntılar sağlayan özellikler içerir. - Bir özel durum oluştuğunda, .NET çalışma zamanı bunu işleyebilen en
catchyakın yan tümceyi arar. Arama, özel durumun oluşturulduğu yöntemle başlar ve gerekirse çağrı yığınını aşağı taşır.