CA1065: Nie należy wyrzucać wyjątków w nieoczekiwanych lokalizacjach
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA1065 |
Tytuł | Nie wywołuj wyjątków w nieoczekiwanych lokalizacjach |
Kategoria | Projekt |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Metoda, od której nie oczekiwano zgłaszania wyjątków, zgłasza wyjątek.
Opis reguły
Metody, które nie powinny zgłaszać wyjątków, można podzielić na kategorie w następujący sposób:
- Metody pobierania właściwości
- Metody dostępu do zdarzeń
- Metody równości
- Metody GetHashCode
- Metody ToString
- Konstruktory statyczne
- Finalizatory
- Metody dispose
- Operatory równości
- Niejawne operatory rzutów
W poniższych sekcjach omówiono te typy metod.
Metody pobierania właściwości
Właściwości są zasadniczo polami inteligentnymi. W związku z tym powinny zachowywać się jak pole jak najwięcej. Pola nie zgłaszają wyjątków ani nie powinny mieć właściwości. Jeśli masz właściwość, która zgłasza wyjątek, rozważ utworzenie metody .
Następujące wyjątki można zgłosić z metody get właściwości:
- System.InvalidOperationException i wszystkie pochodne (w tym System.ObjectDisposedException)
- System.NotSupportedException i wszystkie pochodne
- System.ArgumentException (tylko z indeksowanego get)
- System.Collections.Generic.KeyNotFoundException (tylko z indeksowanego get)
Metody dostępu do zdarzeń
Metody dostępu do zdarzeń powinny być prostymi operacjami, które nie zgłaszają wyjątków. Zdarzenie nie powinno zgłaszać wyjątku podczas próby dodania lub usunięcia procedury obsługi zdarzeń.
Następujące wyjątki można zgłosić z metody dostępu zdarzeń:
- System.InvalidOperationException i wszystkie pochodne (w tym System.ObjectDisposedException)
- System.NotSupportedException i wszystkie pochodne
- System.ArgumentException i pochodne
Metody równości
Następujące metody Equals nie powinny zgłaszać wyjątków:
Metoda Equals
powinna zwracać true
wyjątek lub false
zamiast zgłaszać wyjątek. Jeśli na przykład Equals
przekazano dwa niedopasowane typy, powinno ono zostać zwrócone false
zamiast zgłaszać wartość ArgumentException.
Metody GetHashCode
Następujące GetHashCode
metody zwykle nie powinny zgłaszać wyjątków:
GetHashCode
zawsze powinna zwracać wartość. W przeciwnym razie możesz utracić elementy w tabeli skrótów.
Wersje tego argumentu GetHashCode
mogą zgłaszać wartość ArgumentException. Object.GetHashCode
Jednak nigdy nie należy zgłaszać wyjątku.
Metody ToString
Debuger używa System.Object.ToString metody do wyświetlania informacji o obiektach w formacie ciągu. ToString
W związku z tym nie należy zmieniać stanu obiektu i nie powinien zgłaszać wyjątków.
Konstruktory statyczne
Zgłaszanie wyjątków od konstruktora statycznego powoduje, że typ jest bezużyteczny w bieżącej domenie aplikacji. Należy mieć dobry powód (taki jak problem z zabezpieczeniami) w przypadku zgłaszania wyjątku od konstruktora statycznego.
Finalizatory
Zgłaszanie wyjątku od finalizatora powoduje, że CLR szybko zakończy się niepowodzeniem, co powoduje usunięcie procesu. W związku z tym należy unikać zgłaszania wyjątków w finalizatorze.
Metody dispose
Metoda System.IDisposable.Dispose nie powinna zgłaszać wyjątku. Dispose
jest często wywoływana jako część logiki oczyszczania w klauzuli finally
. W związku z tym jawne zgłaszanie wyjątku wymusza Dispose
na użytkowniku dodanie obsługi wyjątków wewnątrz klauzuli finally
.
Ścieżka Dispose(false)
kodu nigdy nie powinna zgłaszać wyjątków, ponieważ Dispose
jest prawie zawsze wywoływana z finalizatora.
Operatory równości (==, !=)
Podobnie jak Equals
metody, operatory równości powinny zwracać wartości true
lub false
, i nie powinny zgłaszać wyjątków.
Niejawne operatory rzutów
Ponieważ użytkownik często nie wie, że został wywołany niejawny operator rzutowania, nieoczekiwany jest wyjątek zgłaszany przez niejawny operator rzutowania. W związku z tym nie należy zgłaszać żadnych wyjątków z niejawnych operatorów rzutów.
Jak naprawić naruszenia
W przypadku metod pobierania właściwości zmień logikę tak, aby nie musiał już zgłaszać wyjątku lub zmienić właściwość na metodę.
Dla wszystkich innych typów metod wymienionych wcześniej zmień logikę, aby nie musiała już zgłaszać wyjątku.
Kiedy pomijać ostrzeżenia
Jeśli naruszenie zostało spowodowane przez deklarację wyjątku zamiast zgłaszanego wyjątku, można bezpiecznie pominąć ostrzeżenie z tej reguły.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA1065
// The code that's violating the rule is on this line.
#pragma warning restore CA1065
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA1065.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.