Aracılığıyla paylaş


Özel durumlar kullanın

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 fırlatıldıktan sonra, özel durum için bir catch deyim bulunana kadar çağrı yığınında 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 durumu fırlatmak, özel durumdan türetilmiş bir sınıfın örneğini oluşturmayı, isteğe bağlı olarak özel durumun özelliklerini yapılandırmayı ve ardından throw anahtar kelimesi kullanarak nesneyi fırlatmayı içerir. Örneğin:

class CustomException : Exception
{
    public CustomException(string message)
    {
    }
}
private static void TestThrow()
{
    throw new CustomException("Custom exception in TestThrow()");
}

Bir istisna oluşturulduktan sonra, çalışma zamanı, geçerli deyimin try bloğu içinde olup olmadığını kontrol eder. Eğer öyleyse, catch bloğuyla ilişkili olan herhangi bir try bloğun ö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, kontrol catch bloğun sonrasındaki bir sonraki deyime geçer.

Bir try deyim birden catch fazla blok içerebilir. İstisnayı işleyebilen ilk catch deyim yürütülür; uyumlu olsalar bile takip eden catch deyimler göz ardı edilir. En özel (veya en çok türetilen) bloklardan en az özel olana doğru catch bloklarını 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 bloğu yürütülmeden önce, çalışma zamanı finally bloklarını denetler. 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 kurucu veya statik alan başlatıcı içeriyorsa, özgün özel durum yeni özel durumun özelliğine TypeInitializationException atanmış olarak bir InnerException fırlatılır.
  • İş parçacığının başlangıcına ulaşılırsa, iş parçacığı sonlandırılır.