Özel durumlar oluşturma ve oluşturma

Özel durumlar, programı çalıştırırken bir hata oluştuğunun gösterilmesi için kullanılır. Bir hatayı açıklayan özel durum nesneleri oluşturulur ve deyimi veya ifadesiyle throwoluşturulur. Çalışma zamanı daha sonra en uyumlu özel durum işleyicisini arar.

Programcılar, aşağıdaki koşullardan biri veya daha fazlası doğru olduğunda özel durumlar oluşturmalıdır:

  • yöntemi tanımlı işlevselliğini tamamlayamaz. Örneğin, bir yöntemin parametresi geçersiz bir değere sahipse:

    static void CopyObject(SampleClass original)
    {
        _ = original ?? throw new ArgumentException("Parameter cannot be null", nameof(original));
    }
    
  • Nesne durumuna bağlı olarak bir nesneye uygunsuz bir çağrı yapılır. Bir örnek, salt okunur bir dosyaya yazmaya çalışıyor olabilir. Nesne durumunun işleme izin vermediği durumlarda, bu sınıfın InvalidOperationException türetilmesine dayalı olarak veya nesnesinin bir örneğini oluşturun. Aşağıdaki kod, nesne oluşturan InvalidOperationException bir yöntem örneğidir:

    public class ProgramLog
    {
        FileStream logFile = null!;
        public void OpenLog(FileInfo fileName, FileMode mode) { }
    
        public void WriteLog()
        {
            if (!logFile.CanWrite)
            {
                throw new InvalidOperationException("Logfile cannot be read-only");
            }
            // Else write data to the log and return.
        }
    }
    
  • Bir yöntemin bağımsız değişkeni özel duruma neden olduğunda. Bu durumda, özgün özel durum yakalanmalı ve bir ArgumentException örnek oluşturulmalıdır. Özgün özel durum parametresi olarak InnerException oluşturucusunun ArgumentException geçirilmesi gerekir:

    static int GetValueFromArray(int[] array, int index)
    {
        try
        {
            return array[index];
        }
        catch (IndexOutOfRangeException e)
        {
            throw new ArgumentOutOfRangeException(
                "Parameter index is out of range.", e);
        }
    }
    

    Not

    Yukarıdaki örnekte özelliğinin nasıl kullanılacağı gösterilmektedir InnerException . Kasıtlı olarak basitleştirilmiştir. Uygulamada, kullanmadan önce bir dizinin aralıkta olup olmadığını denetlemeniz gerekir. Bir parametrenin üyesi, üyeyi çağırmadan önce tahmin edemeyeceğiniz bir özel durum oluşturursa bu özel durumu sarmalama tekniğini kullanabilirsiniz.

Özel durumlar adlı StackTracebir özellik içerir. Bu dize, geçerli çağrı yığınındaki yöntemlerin adını ve her yöntem için özel durumun oluşturulduğu dosya adını ve satır numarasını içerir. Nesne StackTrace , ortak dil çalışma zamanı (CLR) tarafından deyiminin noktasından otomatik olarak oluşturulur, böylece yığın izlemesinin throw başlaması gereken noktadan özel durumlar oluşturulması gerekir.

Tüm özel durumlar adlı Messagebir özellik içerir. Bu dize, özel durumun nedenini açıklayacak şekilde ayarlanmalıdır. Güvenliğe duyarlı bilgiler ileti metnine yerleştirilmemelidir. öğesine Messageek olarak, ArgumentException özel durumun oluşturulmasına neden olan bağımsız değişkenin adına ayarlanması gereken adlı ParamName bir özellik içerir. Özellik ayarlayıcıda olarak ParamName ayarlanmalıdır value.

Genel ve korumalı yöntemler, amaçlanan işlevlerini tamamlayamadıklarında özel durumlar oluşturur. Oluşan özel durum sınıfı, hata koşullarına uyan en özel durumdur. Bu özel durumlar sınıf işlevselliğinin bir parçası olarak belgelenmelidir ve özgün sınıf için türetilmiş sınıflar veya güncelleştirmeler geriye dönük uyumluluk için aynı davranışı korumalıdır.

Özel durumlar oluştururken kaçınılması gerekenler

Aşağıdaki liste, özel durumlar oluştururken kaçınılması gereken uygulamaları tanımlar:

  • Normal yürütmenin bir parçası olarak bir programın akışını değiştirmek için özel durumlar kullanmayın. Hata koşullarını raporlamak ve işlemek için özel durumları kullanın.
  • Özel durumlar, atılmak yerine dönüş değeri veya parametre olarak döndürülmemelidir.
  • , , System.SystemExceptionveya System.NullReferenceExceptionSystem.IndexOutOfRangeException kasıtlı olarak kendi kaynak kodunuzdan atmayınSystem.Exception.
  • Hata ayıklama modunda oluşturulabilecek ancak yayın modunda oluşturulabilecek özel durumlar oluşturmayın. Geliştirme aşamasındaki çalışma zamanı hatalarını belirlemek için bunun yerine Hata Ayıklama Onayı'nı kullanın.

Görev döndüren yöntemlerde özel durumlar

Değiştirici ile bildirilen yöntemlerin async özel durumlar söz konusu olduğunda dikkate alınması gereken bazı özel noktalar vardır. Bir async yöntemde oluşan özel durumlar döndürülen görevde depolanır ve örneğin görev beklenene kadar ortaya çıkmaz. Depolanan özel durumlar hakkında daha fazla bilgi için bkz . Zaman uyumsuz özel durumlar.

Yöntemlerinizin zaman uyumsuz bölümlerini girmeden önce bağımsız değişkenleri doğrulamanızı ve ve ArgumentNullExceptiongibi ArgumentException ilgili özel durumları oluşturmanızı öneririz. Diğer bir ifadeyle, bu doğrulama özel durumlarının çalışma başlamadan önce zaman uyumlu bir şekilde ortaya çıkması gerekir. Aşağıdaki kod parçacığında, özel durumlar oluşturulursa ArgumentException özel durumların zaman uyumlu olarak ortaya çıktığı, InvalidOperationException ancak döndürülen görevde depolandığı bir örnek gösterilmektedir.

// Non-async, task-returning method.
// Within this method (but outside of the local function),
// any thrown exceptions emerge synchronously.
public static Task<Toast> ToastBreadAsync(int slices, int toastTime)
{
    if (slices is < 1 or > 4)
    {
        throw new ArgumentException(
            "You must specify between 1 and 4 slices of bread.",
            nameof(slices));
    }

    if (toastTime < 1)
    {
        throw new ArgumentException(
            "Toast time is too short.", nameof(toastTime));
    }

    return ToastBreadAsyncCore(slices, toastTime);

    // Local async function.
    // Within this function, any thrown exceptions are stored in the task.
    static async Task<Toast> ToastBreadAsyncCore(int slices, int time)
    {
        for (int slice = 0; slice < slices; slice++)
        {
            Console.WriteLine("Putting a slice of bread in the toaster");
        }
        // Start toasting.
        await Task.Delay(time);

        if (time > 2_000)
        {
            throw new InvalidOperationException("The toaster is on fire!");
        }

        Console.WriteLine("Toast is ready!");

        return new Toast();
    }
}

Özel durum sınıflarını tanımlama

Programlar ad alanında System önceden tanımlanmış bir özel durum sınıfı oluşturabilir (daha önce belirtildiği durumlar dışında) veya öğesinden Exceptiontüretilerek kendi özel durum sınıflarını oluşturabilir. Türetilmiş sınıfların en az üç oluşturucu tanımlaması gerekir: bir parametresiz oluşturucu, ileti özelliğini ayarlayan ve hem hem InnerException de Message özelliklerini ayarlayan bir oluşturucu. Örneğin:

[Serializable]
public class InvalidDepartmentException : Exception
{
    public InvalidDepartmentException() : base() { }
    public InvalidDepartmentException(string message) : base(message) { }
    public InvalidDepartmentException(string message, Exception inner) : base(message, inner) { }
}

Sağladıkları veriler özel durumu çözümlemek için yararlı olduğunda özel durum sınıfına yeni özellikler ekleyin. Türetilmiş özel durum sınıfına yeni özellikler eklenirse, ToString() eklenen bilgileri döndürmek için geçersiz kılınmalıdır.

C# dili belirtimi

Daha fazla bilgi için bkz. C# Dil Belirtimindeki Özel Durumlar ve Throw deyimi. Dil belirtimi, C# sözdizimi ve kullanımı için kesin bir kaynaktır.

Ayrıca bkz.