CA1064: Le eccezioni devono essere pubbliche

Proprietà valore
ID regola CA1064
Titolo Le eccezioni devono essere pubbliche
Categoria Progettazione
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 No

Causa

Un'eccezione non pubblica deriva direttamente da Exception, SystemExceptiono ApplicationException.

Descrizione regola

Un'eccezione interna è visibile solo all'interno del proprio ambito interno. Se l'eccezione si verifica al di fuori dell'ambito interno, può essere rilevata solo tramite l'eccezione di base. Se l'eccezione interna viene ereditata da Exception, SystemExceptiono ApplicationException, il codice esterno non avrà informazioni sufficienti per sapere cosa fare con l'eccezione.

Tuttavia, se il codice presenta un'eccezione pubblica che verrà usata successivamente come base per un'eccezione interna, è ragionevole presupporre che il codice possa eseguire un'operazione intelligente con l'eccezione di base. L'eccezione pubblica avrà più informazioni di quelle fornite da Exception, SystemExceptiono ApplicationException.

Come correggere le violazioni

Rendere pubblica l'eccezione o derivare l'eccezione interna da un'eccezione pubblica che non Exceptionè , SystemExceptiono ApplicationException.

Quando eliminare gli avvisi

Eliminare un messaggio da questa regola se si è certi che in tutti i casi l'eccezione privata verrà intercettata all'interno del proprio ambito interno.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

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

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

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

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Esempio

Questa regola viene attivata nel primo metodo di esempio FirstCustomException perché la classe di eccezione deriva direttamente da Exception ed è interna. La regola non viene attivata sulla classe SecondCustomException perché anche se la classe deriva direttamente da Exception, la classe viene dichiarata pubblica. La terza classe non genera anche la regola perché non deriva direttamente da System.Exception, System.SystemExceptiono 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)
    {
    }
}