CA1064: Özel durumlar genel olmamalıdır

Özellik Değer
Kural Kimliği CA1064
Başlık Özel durumlar genel olmalıdır
Kategori Tasarım
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Hayır

Neden

Genel olmayan bir özel durum doğrudan , SystemExceptionveya ApplicationExceptionöğesinden Exceptiontüretilir.

Kural açıklaması

İç özel durum yalnızca kendi iç kapsamı içinde görünür. İç kapsam dışında kalan özel durumlardan sonra, sadece basit istisnalar istisna yakalamak için kullanılabilir. İç özel durum , SystemExceptionveya ApplicationExceptionöğesinden Exceptiondevralındıysa, dış kod özel durumla ne yapacağını bilmek için yeterli bilgiye sahip olmaz.

Ancak, kodun daha sonra bir iç özel durum için temel olarak kullanılan genel bir özel durumu varsa, kodun daha sonra temel özel durumla akıllı bir şey yapabileceğini varsaymak mantıklıdır. Genel özel durum, , SystemExceptionveya ApplicationExceptiontarafından Exceptionsağlanandan daha fazla bilgiye sahip olacaktır.

İhlalleri düzeltme

Özel durumu genel yapın veya iç özel durumu , SystemExceptionveya ApplicationExceptionolmayan Exceptionbir genel özel durumdan türeyin.

Uyarıların ne zaman bastırılması gerekiyor?

Özel özel durumun kendi iç kapsamı içinde yakalanacağı her durumda eminseniz, bu kuraldan bir iletiyi gizleyebilirsiniz.

Uyarıyı gizleme

Yalnızca tek bir ihlali engellemek istiyorsanız, kuralı devre dışı bırakmak ve sonra yeniden etkinleştirmek için kaynak dosyanıza ön işlemci yönergeleri ekleyin.

#pragma warning disable CA1064
// The code that's violating the rule is on this line.
#pragma warning restore CA1064

Bir dosya, klasör veya projenin kuralını devre dışı bırakmak için, yapılandırma dosyasındaki önem derecesini noneolarak ayarlayın.

[*.{cs,vb}]
dotnet_diagnostic.CA1064.severity = none

Daha fazla bilgi için bkz . Kod analizi uyarılarını gizleme.

Örnek

Özel durum sınıfı doğrudan Exception'tan türetildiği ve iç olduğu için bu kural ilk örnek yöntem olan FirstCustomException'da tetiklenir. Sınıf da doğrudan Exception'tan türetilmiş olsa da, sınıf genel olarak bildirildiğinden, kural SecondCustomException sınıfında tetiklenmez. Üçüncü sınıf, doğrudan , System.SystemExceptionveya System.ApplicationExceptionöğesinden System.Exceptiontüretilmediğinden kuralı da tetiklemiyor.

// Violates this rule
[Serializable]
internal class FirstCustomException : Exception
{
    internal FirstCustomException()
    {
    }

    internal FirstCustomException(string message)
        : base(message)
    {
    }

    internal FirstCustomException(string message, Exception innerException)
        : base(message, innerException)
    {
    }

    protected FirstCustomException(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }
}

// Does not violate this rule because
// SecondCustomException is public
[Serializable]
public class SecondCustomException : Exception
{
    public SecondCustomException()
    {
    }

    public SecondCustomException(string message)
        : base(message)
    {

    }

    public SecondCustomException(string message, Exception innerException)
        : base(message, innerException)
    {
    }

    protected SecondCustomException(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }
}

// Does not violate this rule because
// ThirdCustomException it does not derive directly from
// Exception, SystemException, or ApplicationException
[Serializable]
internal class ThirdCustomException : SecondCustomException
{
    internal ThirdCustomException()
    {
    }

    internal ThirdCustomException(string message)
        : base(message)
    {
    }

    internal ThirdCustomException(string message, Exception innerException)
        : base(message, innerException)
    {
    }


    protected ThirdCustomException(SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
    }
}