Udostępnij za pośrednictwem


CA1065: Nie wywołuj wyjątków w nieoczekiwanych miejscach

Właściwości Wartość
Identyfikator reguły CA1065
Tytuł Nie wywołuj wyjątków w nieoczekiwanych lokalizacjach
Kategoria Projektowanie
Poprawka łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Nie.
Zastosowane języki C# i Visual Basic

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 usuwania
  • Operatory równości
  • Niejawne operatory rzutowania

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 jak najbardziej przypominać pole. Pola nie zgłaszają wyjątków i tak samo nie powinny tego robić właściwości. Jeśli masz właściwość, która zgłasza wyjątek, rozważ przekształcenie jej w metodę.

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

Metody równości

Następujące metody Equals nie powinny zgłaszać wyjątków:

Metoda Equals powinna zwracać true lub false zamiast zgłaszać wyjątek. Jeśli na przykład Equals przekazano dwa niedopasowane typy, powinien po prostu zwrócić false zamiast zgłaszać wyjątek 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 GetHashCode, które akceptują argument, mogą zgłaszać ArgumentException. Object.GetHashCode Jednak nigdy nie należy zgłaszać wyjątku.

Metody ToString

Debugger używa System.Object.ToString 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łoszenie wyjątku w finalizatorze powoduje, że CLR szybko ulega awarii, co prowadzi do zakończenia procesu. W związku z tym należy unikać zgłaszania wyjątków w finalizatorze.

Metody usuwania

Metoda System.IDisposable.Dispose nie powinna zgłaszać wyjątku. Dispose jest często wywoływana jako część logiki oczyszczania w klauzuli finally . Dlatego też, jawne rzucanie wyjątku z Dispose wymusza 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 rzutowania

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ż