Share via


Ö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.