CA1064: Ausnahmen sollten öffentlich sein.
Eigenschaft | Wert |
---|---|
Regel-ID | CA1064 |
Titel | Ausnahmen sollten öffentlich sein. |
Kategorie | Design |
Fix führt oder führt nicht zur Unterbrechung | Nicht unterbrechend |
Standardmäßig in .NET 8 aktiviert | Nein |
Ursache
Eine nicht öffentliche Ausnahme leitet sich direkt von Exception, SystemException oder ApplicationException ab.
Regelbeschreibung
Eine interne Ausnahme ist nur innerhalb ihres eigenen internen Bereichs sichtbar. Nachdem die Ausnahme den internen Bereich verlassen hat, kann nur die Basisausnahme zum Abfangen der Ausnahme verwendet werden. Wenn die interne Ausnahme von Exception, SystemException, oder ApplicationException geerbt wurde, verfügt der externe Code nicht über genügend Informationen zur Behandlung der Ausnahme.
Wenn der Code jedoch eine öffentliche Ausnahme aufweist, die später als Basis für eine interne Ausnahme verwendet wird, kann davon ausgegangen werden, dass der Code im weiteren Verlauf in der Lage sein wird, mit der Basisausnahme auf intelligente Weise umzugehen. Die öffentliche Ausnahme enthält mehr Informationen, als von Exception, SystemException oder ApplicationException bereitgestellt werden.
Behandeln von Verstößen
Legen Sie die Ausnahme als öffentlich fest oder leiten Sie die interne Ausnahme von einer öffentlichen Ausnahme ab, die nicht Exception, SystemException oder ist ApplicationException.
Wann sollten Warnungen unterdrückt werden?
Unterdrücken Sie eine Meldung von dieser Regel, wenn Sie sicher sind, dass die private Ausnahme in jedem Fall innerhalb ihres eigenen internen Bereichs abgefangen wird.
Unterdrücken einer Warnung
Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.
#pragma warning disable CA1064
// The code that's violating the rule is on this line.
#pragma warning restore CA1064
Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none
fest.
[*.{cs,vb}]
dotnet_diagnostic.CA1064.severity = none
Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.
Beispiel
Diese Regel wird bei der ersten Beispielmethode, „FirstCustomException“, ausgelöst, da die Ausnahmeklasse direkt von der Ausnahme abgeleitet und intern ist. Die Regel wird bei der Klasse „SecondCustomException“ nicht ausgelöst, da die Klasse zwar ebenfalls direkt von einer Ausnahme abgeleitet ist, aber als öffentlich deklariert ist. Die dritte Klasse löst die Regel ebenfalls nicht aus, da sie nicht direkt von System.Exception, System.SystemException oder System.ApplicationException abgeleitet ist.
// 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)
{
}
}