CA1065: Nevyvolávejte výjimky v neočekávaných umístěních
Vlastnost | Hodnota |
---|---|
ID pravidla | CA1065 |
Název | Nevyvolávejte výjimky v neočekávaných umístěních |
Kategorie | Návrh |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 9 | No |
Příčina
Metoda, u které není předpokládáno vyvolání výjimky, vyvolá výjimku.
Popis pravidla
Metody, které nemají vyvolat výjimky, je možné kategorizovat následujícím způsobem:
- Metody get vlastnosti
- Metody přístupového objektu událostí
- Rovná se metodám
- Metody GetHashCode
- Metody ToString
- Statické konstruktory
- Finalizační metody
- Dispose – metody
- Operátory rovnosti
- Implicitní operátory přetypování
Tyto typy metod jsou popsány v následujících částech.
Metody get vlastnosti
Vlastnosti jsou v podstatě inteligentní pole. Proto by se měly chovat jako pole co nejvíce. Pole nevyvolají výjimky a ani by neměly mít vlastnosti. Pokud máte vlastnost, která vyvolá výjimku, zvažte vytvoření metody.
Následující výjimky mohou být vyvolány z metody get vlastnosti:
- System.InvalidOperationException a všechny deriváty (včetně System.ObjectDisposedException)
- System.NotSupportedException a všechny deriváty
- System.ArgumentException (pouze z indexovaného získání)
- System.Collections.Generic.KeyNotFoundException (pouze z indexovaného získání)
Metody přístupového objektu událostí
Přístupové objekty událostí by měly být jednoduché operace, které nevyvolají výjimky. Událost by neměla vyvolat výjimku při pokusu o přidání nebo odebrání obslužné rutiny události.
Přistupování událostí může vyvolat následující výjimky:
- System.InvalidOperationException a všechny deriváty (včetně System.ObjectDisposedException)
- System.NotSupportedException a všechny deriváty
- System.ArgumentException a deriváty
Rovná se metodám
Následující metody Equals by neměly vyvolat výjimky:
Metoda Equals
by se měla vrátit true
nebo false
místo vyvolání výjimky. Pokud Equals
například předáte dva neshodné typy, měl by se vrátit false
místo vyvolání znaku ArgumentException.
Metody GetHashCode
Následující GetHashCode
metody by obvykle neměly vyvolat výjimky:
GetHashCode
vždy by měla vrátit hodnotu. V opačném případě můžete ztratit položky v tabulce hash.
VerzeGetHashCode
, které přebírají argument, mohou vyvolat .ArgumentException Object.GetHashCode
Nikdy byste ale neměli vyvolat výjimku.
Metody ToString
Ladicí program používá System.Object.ToString k zobrazení informací o objektech ve formátu řetězce. ToString
Proto by neměl měnit stav objektu a neměl by vyvolat výjimky.
Statické konstruktory
Vyvolání výjimek ze statického konstruktoru způsobí, že typ bude v aktuální doméně aplikace nepoužitelný. Měli byste mít dobrý důvod (například problém se zabezpečením) pro vyvolání výjimky ze statického konstruktoru.
Finalizační metody
Vyvolání výjimky z finalizátoru způsobí, že CLR selže rychle, což proces přeruší. Proto se vyhněte vyvolání výjimek v finalizátoru.
Dispose – metody
Metoda System.IDisposable.Dispose by neměla vyvolat výjimku. Dispose
je často volána jako součást logiky čištění v finally
klauzuli. Proto explicitně vyvolání výjimky z Dispose
vynutí uživatele přidat zpracování výjimek uvnitř finally
klauzule.
Cesta Dispose(false)
kódu by nikdy neměla vyvolat výjimky, protože Dispose
je téměř vždy volána z finalizátoru.
Operátory rovnosti (==, !=)
Podobně jako Equals
metody by operátory rovnosti měly vracet buď true
nebo false
, a neměly by vyvolat výjimky.
Implicitní operátory přetypování
Vzhledem k tomu, že uživatel často neví, že byl volán implicitní operátor přetypování, je neočekávaná výjimka vyvolaná operátorem implicitního přetypování. Proto by z implicitních operátorů přetypování neměly být vyvolány žádné výjimky.
Jak opravit porušení
U metody getters změňte logiku tak, aby již nemusela vyvolat výjimku, nebo změňte vlastnost na metodu.
U všech ostatních typů metod uvedených dříve změňte logiku tak, aby již nemusela vyvolat výjimku.
Kdy potlačit upozornění
Pokud příčinou porušení byla deklarace výjimky místo vyvolané výjimky, je bezpečné potlačit upozornění z tohoto pravidla.
Potlačení upozornění
Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.
#pragma warning disable CA1065
// The code that's violating the rule is on this line.
#pragma warning restore CA1065
Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none
konfiguračním souboru.
[*.{cs,vb}]
dotnet_diagnostic.CA1065.severity = none
Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.