CA1065: Nie należy wyrzucać wyjątków w nieoczekiwanych lokalizacjach
TypeName |
DoNotRaiseExceptionsInUnexpectedLocations |
CheckId |
CA1065 |
Kategoria |
Microsoft.Design |
Zmiana kluczowa |
Niekluczowa |
Przyczyna
Metoda, od której nie oczekiwano zgłaszania wyjątków, zgłasza wyjątek.
Opis reguły
Metody, od których nie oczekuje się zgłaszania wyjątków, mogą zostać podzielone w następujący sposób:
Metody Get właściwości
Metody dostępu do zdarzeń
Metody Equals
Metody GetHashCode
Metody ToString
Konstruktory statyczne
Finalizatory
Metody Dispose
Operatory równości
Operatory niejawnego rzutowania
W poniższych sekcjach opisano te typy metody.
Metody Get właściwości
Właściwości są zasadniczo inteligentnymi polami.Dlatego powinny działać możliwie podobnie do pól.Pola nie zgłaszają wyjątków i z tego powodu właściwości również nie powinny ich zgłaszać.Jeśli posiadasz właściwość, która zgłasza wyjątek, rozważ zmianę jej na metodę.
Następujące wyjątki mogą być zgłaszane przez metodę get właściwości:
InvalidOperationException i wszystkie pochodne (włącznie z ObjectDisposedException)
NotSupportedException i wszystkie pochodne
ArgumentException (tylko z indeksowanej metody get)
KeyNotFoundException (tylko z indeksowanej metody get)
Metody dostępu do zdarzeń
Dostęp do zdarzeń powinien być prostymi operacjami, które nie zgłaszają wyjątków.Zdarzenie nie powinno zgłaszać wyjątków, gdy próbujesz dodać lub usunąć obsługę zdarzenia.
Następujące wyjątki mogą być zgłaszane podczas dostępu do zdarzeń:
InvalidOperationException i wszystkie pochodne (włącznie z ObjectDisposedException)
NotSupportedException i wszystkie pochodne
ArgumentException i pochodne
Metody Equals
Następujące metody Equals nie powinny zgłaszać wyjątków:
Metoda Equals powinna zwrócić true lub false zamiast zgłaszać wyjątek.Na przykład, jeśli do metody Equals zostaną przekazane dwa niedopasowane typy, powinna zwrócić po prostu false zamiast zgłaszać wyjątek ArgumentException.
Metody GetHashCode
Następujące metody GetHashCode zazwyczaj nie powinny zgłaszać wyjątków:
Metoda GetHashCode powinna zawsze zwracać wartość.W przeciwnym razie, możesz stracić elementy w tabeli skrótów.
Wersje metody GetHashCode, które przyjmują argument, mogą zgłosić wyjątek ArgumentException.Jednakże, metoda Object.GetHashCode nigdy nie powinna zgłaszać wyjątku.
Metody ToString
Debuger wykorzystuje metodę Object.ToString do wyświetlania informacji o obiektach w formacie ciągu znaków.Dlatego, metoda ToString nie powinna zmieniać stanu obiektu i nie powinna zgłaszać wyjątków.
Konstruktory statyczne
Zgłaszanie wyjątków w konstruktorze statycznym powoduje brak możliwości użycia typu w bieżącej domenie aplikacji.Należy mieć bardzo dobry powód (na przykład z powodu zabezpieczeń), żeby zgłaszać wyjątek w konstruktorze statycznym.
Finalizatory
Zgłaszanie wyjątku w finalizatorze powoduje natychmiastowy błąd CLR, który usuwa proces.Dlatego, zawsze należy unikać zgłaszania wyjątków w finalizatorze.
Metody Dispose
Metoda IDisposable.Dispose nie powinna zgłaszać wyjątków.Metoda Dispose jest często wywoływana jako część logiki oczyszczania w klauzuli finally.Dlatego, jawne zgłaszanie wyjątku w metodzie Dispose zmusza użytkownika do dodania obsługi wyjątku wewnątrz klauzuli finally.
Ścieżka kodu Dispose(false) nigdy nie powinna zgłaszać wyjątków, ponieważ jest prawie zawsze wywoływana z finalizatora.
Operatory równości (==, !=)
Podobnie do metody Equals, operatory równości powinny zwrócić true lub false i nie powinny zgłaszać wyjątków.
Operatory niejawnego rzutowania
Ponieważ użytkownik jest często nieświadomy, że wywołany został niejawny operator rzutowania, wyjątek zgłoszony przez ten operator jest całkowicie nieoczekiwany.Dlatego, żadne wyjątki nie powinny być zgłaszane przez niejawne operatory rzutowania.
Jak naprawić naruszenia
W przypadku metod pobierających właściwości, zmień logikę, aby nie zgłaszała wyjątku albo zmień właściwość na metodę.
W przypadku wszystkich pozostałych typów metod wymienionych wcześniej, zmień logikę, aby nie musiała już zgłaszać wyjątków.
Kiedy pominąć ostrzeżenia
Można bezpiecznie pominąć ostrzeżenie dotyczące tej reguły, jeżeli naruszenie było spowodowane deklaracją wyjątku, a nie zgłoszeniem wyjątku.
Powiązane reguły
CA2219: Nie zgłaszaj wyjątków w klauzulach wyjątków