Sdílet prostřednictvím


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:

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:

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.

Viz také