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 8 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:

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ń:

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.

Zobacz też