CA1065: Nevyvolávejte výjimky v nepředvídaný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, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Ne
Příslušné jazyky C# a Visual Basic

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 pro získání vlastností
  • Metody přistupu k událostem
  • Rovná se metodám
  • Metody GetHashCode
  • Metody ToString
  • Statické konstruktory
  • Finalizátory
  • Dispose – metody
  • Operátory rovnosti
  • Implicitní operátory přetypování

Tyto typy metod jsou popsány v následujících částech.

Metody získání vlastností

Vlastnosti jsou v podstatě inteligentní pole. Proto by se měly chovat jako pole jak jen to jde. Pole nevyvolávají výjimky a ani by je neměly vyvolávat 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 získání vlastnosti:

Metody přístupového objektu událostí

Metody přístupu k událostem by měly být jednoduché operace, které nezpůsobují výjimky. Událost by neměla vyvolat výjimku, když se pokusíte přidat nebo odebrat obslužnou rutinu události.

Z přistupovače události mohou být vyvolány následující výjimky:

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.

Verze GetHashCode, 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 v řetězcovém formátu. 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.

Finalizátory

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 konverze

Vzhledem k tomu, že uživatel často neví, že byl volán implicitní operátor přetypování, je výjimka vyvolaná tímto operátorem neočekávaná. Proto by z implicitních přetypovacích operátorů 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.

Viz také