Özel durumları kullanma
C# dilinde, çalışma zamanındaki programdaki hatalar, özel durumlar adlı bir mekanizma kullanılarak program aracılığıyla yayılır. Hatayla karşılaşan ve hatayı düzeltebilen kod tarafından yakalanan kod tarafından özel durumlar oluşturulur. Özel durumlar .NET çalışma zamanı veya bir programdaki kod tarafından oluşturulabilir. Bir özel durum oluşturulduktan sonra, özel durum için bir catch
deyim bulunana kadar çağrı yığınını yayılır. Yakalanmayan özel durumlar, bir iletişim kutusu görüntüleyen sistem tarafından sağlanan genel bir özel durum işleyicisi tarafından işlenir.
Özel durumlar, 'den Exceptiontüretilen sınıflarla temsil edilir. Bu sınıf, özel durum türünü tanımlar ve özel durumla ilgili ayrıntıları içeren özellikler içerir. Özel durum oluşturmak, özel durum türetilmiş bir sınıfın örneğini oluşturmayı, isteğe bağlı olarak özel durumun özelliklerini yapılandırmayı ve sonra anahtar sözcüğünü throw
kullanarak nesnesini oluşturmayı içerir. Örneğin:
class CustomException : Exception
{
public CustomException(string message)
{
}
}
private static void TestThrow()
{
throw new CustomException("Custom exception in TestThrow()");
}
Bir özel durum oluşturulduktan sonra, çalışma zamanı geçerli deyimi bir blok içinde try
olup olmadığını görmek için denetler. Bu durumda, blokla try
ilişkili tüm catch
bloklar, özel durumu yakalayıp yakalayamayacağını görmek için denetlenir. Catch
bloklar genellikle özel durum türlerini belirtir; Bloğun catch
türü özel durumla aynı türdeyse veya özel durumun temel sınıfıysa, catch
blok yöntemini işleyebilir. Örneğin:
try
{
TestThrow();
}
catch (CustomException ex)
{
System.Console.WriteLine(ex.ToString());
}
Özel durum oluşturan deyim bir try
blok içinde değilse veya bunu kapsayan bloğun try
eşleşen catch
bir bloğu yoksa, çalışma zamanı çağırma yöntemini bir try
deyim ve catch
bloklar için denetler. Çalışma zamanı, uyumlu catch
bir bloğu arayarak çağrı yığınını yükseltmeye devam eder. catch
Blok bulunduktan ve yürütüldükten sonra, denetim bu catch
bloğun sonraki deyimine geçirilir.
Bir try
deyim birden catch
fazla blok içerebilir. Özel durumu işleyebilen ilk catch
deyim yürütülür; uyumlu olsalar bile aşağıdaki catch
deyimler yoksayılır. En belirli (veya en çok türetilen) ile en az belirli olan blokları sırala. Örneğin:
using System;
using System.IO;
namespace Exceptions
{
public class CatchOrder
{
public static void Main()
{
try
{
using (var sw = new StreamWriter("./test.txt"))
{
sw.WriteLine("Hello");
}
}
// Put the more specific exceptions first.
catch (DirectoryNotFoundException ex)
{
Console.WriteLine(ex);
}
catch (FileNotFoundException ex)
{
Console.WriteLine(ex);
}
// Put the least specific exception last.
catch (IOException ex)
{
Console.WriteLine(ex);
}
Console.WriteLine("Done");
}
}
}
catch
Blok yürütülmeden önce çalışma zamanı blokları denetlerfinally
. Finally
bloklar, programcının durdurulan try
bir bloktan kalan belirsiz durumları temizlemesine veya çalışma zamanında atık toplayıcının nesneleri sonlandırmasını beklemeden dış kaynakları (grafik tanıtıcıları, veritabanı bağlantıları veya dosya akışları gibi) serbest bırakmasına olanak tanır. Örneğin:
static void TestFinally()
{
FileStream? file = null;
//Change the path to something that works on your machine.
FileInfo fileInfo = new System.IO.FileInfo("./file.txt");
try
{
file = fileInfo.OpenWrite();
file.WriteByte(0xF);
}
finally
{
// Closing the file allows you to reopen it immediately - otherwise IOException is thrown.
file?.Close();
}
try
{
file = fileInfo.OpenWrite();
Console.WriteLine("OpenWrite() succeeded");
}
catch (IOException)
{
Console.WriteLine("OpenWrite() failed");
}
}
Özel durum oluşturulursa WriteByte()
, dosyayı yeniden açmaya çalışan ikinci try
bloktaki kod çağrılmazsa file.Close()
başarısız olur ve dosya kilitli kalır. Bir finally
özel durum oluşturulsa bile bloklar yürütülür çünkü önceki örnekteki finally
blok dosyanın doğru şekilde kapatılmasına izin verir ve bir hatayı önlemeye yardımcı olur.
Bir özel durum oluşturulduktan sonra çağrı yığınında uyumlu catch
bir blok bulunmazsa üç şeyden biri gerçekleşir:
- Özel durum bir sonlandırıcı içindeyse, sonlandırıcı durduruldu ve varsa temel sonlandırıcı çağrılır.
- Çağrı yığını statik bir oluşturucu veya statik alan başlatıcı içeriyorsa, özgün özel durum yeni özel durumun özelliğine InnerException atanmış olarak bir TypeInitializationException oluşturulur.
- İş parçacığının başlangıcına ulaşılırsa, iş parçacığı sonlandırılır.