Megosztás a következőn keresztül:


CA1064: A kivételeknek nyilvánosnak kell lenniük

Tulajdonság Érték
Szabályazonosító CA1064
Cím A kivételeknek nyilvánosnak kell lenniük
Kategória Design
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 8-ban Nem

Ok

A nem nyilvános kivétel származik közvetlenül az Exception, SystemExceptionvagy ApplicationException.

Szabály leírása

A belső kivétel csak a saját belső hatókörén belül látható. Miután a kivétel kívül esik a belső hatókörön, csak az alapkivétel használható a kivétel elfogásához. Ha a belső kivétel a külső kódtól ExceptionSystemExceptionöröklődik, ApplicationExceptionakkor a külső kód nem rendelkezik elegendő információval ahhoz, hogy tudja, mit tegyen a kivétellel.

Ha azonban a kód nyilvános kivétellel rendelkezik, amelyet később egy belső kivétel alapjául használnak, ésszerű feltételezni, hogy a kód tovább képes lesz valami intelligensre az alapkivétellel. A nyilvános kivételnek több információja lesz, mint az Exception, SystemExceptionvagy ApplicationException.

Szabálysértések kijavítása

Tegye nyilvánossá a kivételt, vagy a belső kivételt olyan nyilvános kivételből származtathatja, amely nem , SystemExceptionvagy ApplicationExceptionnemException.

Mikor kell letiltani a figyelmeztetéseket?

Ha minden esetben biztos abban, hogy a privát kivétel a saját belső hatókörébe kerül, tiltsa le a szabályból érkező üzeneteket.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

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

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

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

További információ: Kódelemzési figyelmeztetések letiltása.

Példa

Ez a szabály az első példametódus, a FirstCustomException metódust aktiválja, mivel a kivételosztály közvetlenül a Kivételből származik, és belső. A szabály nem aktiválódik a SecondCustomException osztályon, mert bár az osztály közvetlenül a Kivételből is származik, az osztály nyilvánosként lesz deklarálva. A harmadik osztály nem is aktiválja a szabályt, mert nem származik közvetlenül az System.Exception, System.SystemExceptionvagy System.ApplicationException.

// 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)
    {
    }
}