CA1065: Není vyvolají výjimky neočekávaných místech.
TypeName |
DoNotRaiseExceptionsInUnexpectedLocations |
CheckId |
CA1065 |
Kategorie |
Microsoft.Design |
Narušující změna |
Nenarušující |
Příčina
Metoda, u které není předpokládáno vyvolání výjimky, vyvolala výjimku.
Popis pravidla
Metody, u kterých se neočekává vyvolávání výjimek, lze kategorizovat následujícím způsobem:
Metody Get pro vlastnosti
Metody přístupových objektů události
Metody Equals
Metody GetHashCode
Metody ToString
Statické konstruktory.
Finalizační metody
Metody Dispose
Operátory rovnosti
Operátory implicitního přetypování
Následující oddíly popisují tyto typy metod.
Metody Get pro vlastnosti
Vlastnosti jsou v zásadě inteligentní pole.Proto by se jejich chování mělo co nejvíce podobat poli.Pole nevyvolávají výjimky, což by neměly ani vlastnosti.Pokud máte vlastnost, která vyvolává výjimku, zvažte její změnu na metodu.
Následující výjimky mohou být vyvolány metodou Get pro vlastnost:
System.InvalidOperationException a všechny odvozené (včetně výjimky System.ObjectDisposedException)
System.NotSupportedException a všechny odvozené
System.ArgumentException (jen v indexované metodě Get)
KeyNotFoundException (jen v indexované metodě Get)
Metody přístupových objektů události
Přístupové objekty události by měly být jednoduchými operacemi, které nevyvolávají výjimky.Událost by neměla vyvolávat výjimku při pokusu přidat nebo odebrat obslužnou rutinu události.
Následující výjimky mohou být vyvolány z přístupového objektu události:
System.InvalidOperationException a všechny odvozené (včetně výjimky System.ObjectDisposedException)
System.NotSupportedException a všechny odvozené
ArgumentException a odvozené
Metody Equals
Následující metody Equals by neměly vyvolávat výjimky:
Metoda Equals by namísto vyvolání výjimky měla vracet hodnotu true nebo false.Jsou-li například metodě Equals předány dva neshodné typy, měla by vrátit pouze hodnotu false namísto vyvolání výjimky ArgumentException.
Metody GetHashCode
Následující metody GetHashCode by obvykle neměly vyvolávat výjimky:
Metoda GetHashCode by měla vždy vracet hodnotu.V opačném případě může dojít ke ztrátě položek zatřiďovací tabulky
Verze metody GetHashCode přijímající argumenty mohou vyvolat výjimku ArgumentException.Metoda Object.GetHashCode by však nikdy výjimku vyvolat neměla.
Metody ToString
Ladicí program používá metodu Object.ToString pro zobrazení informací o objektech ve formátu řetězce.Proto by metoda ToString neměla měnit stav objektu a vyvolávat výjimky.
Statické konstruktory.
Vyvolávání výjimek ve statickém konstruktoru činí v aktuální doméně aplikací typ nepoužitelným.Pro vyvolání výjimky ze statického konstruktoru by měl existovat velmi dobrý důvod (například problém se zabezpečením).
Finalizační metody
Vyvolání výjimky z finalizační metody způsobuje rychlé selhání modulu CLR, což značně poškozuje proces.Proto je ve finalizačních metodách zapotřebí se vždy vyhnout vyvolávání výjimek.
Metody Dispose
Metoda IDisposable.Dispose by neměla vyvolávat výjimku.Metoda Dispose je obvykle volána jako součást logiky čištění v klauzuli finally.Explicitní vyvolávání výjimky z metody Dispose proto nutí uživatele přidat kód pro zpracování výjimky do klauzule finally.
Cesta kódu Dispose(false) by nikdy neměla vyvolat výjimku, protože je téměř vždy volána z finalizační metody.
Operátory rovnosti (==, !=)
Obdobně jako metody Equals by operátory rovnosti měly vracet hodnotu true nebo false a neměly by vyvolávat výjimky.
Operátory implicitního přetypování
Jelikož uživatelé si často nejsou vědomi, že byl volán operátor implicitního přetypování, je vyvolání výjimky operátorem implicitního přetypování zcela neočekávané.Proto by z operátorů implicitního přetypování neměly být vyvolávány žádné výjimky.
Jak vyřešit porušení
U metod Get pro vlastnosti buď změňte logiku tak, aby již nevyvolávala výjimku, nebo změňte vlastnost na metodu.
U všech ostatních dříve uvedených typů metod změňte logiku tak, aby již nemusela vyvolávat výjimku.
Kdy potlačit upozornění
Toto upozornění je bezpečné potlačit, pokud bylo porušení zapříčiněno deklarací výjimky, nikoli vyvoláním výjimky.
Související pravidla
CA2219: Není vyvolají výjimky v klauzulích výjimky