Programovanie

Najlepšie postupy pri riešení výnimiek v C #

Spracovanie výnimiek je technika spracovania runtime chýb v kóde vašej aplikácie. V zásade existujú dve kategórie výnimiek: Výnimky, ktoré generuje aplikácia, a tie, ktoré generuje modul runtime. S výnimkami by sa malo zaobchádzať opatrne - mali by ste mať dobrú predstavu o tom, ako by sa malo s výnimkami zaobchádzať a kedy je potrebné, aby sa s nimi vo vašom kóde zaobchádzalo. V tomto príspevku predstavím niekoľko tipov a osvedčených postupov na prácu s výnimkami v C #.

Základnou triedou pre všetky výnimky v .NET je výnimka. Všetky triedy výnimiek v hierarchii výnimiek pochádzajú priamo alebo nepriamo z tejto triedy. Triedy ApplicationException a SystemException sú odvodené od triedy Exception. Common Language Runtime (CLR) vyvolá inštanciu typu, ktorý je odvodený od SystemException, keď dôjde k chybe za behu. Upozorňujeme, že by ste nikdy nemali chytiť SystemException alebo hodiť inštanciu SystemException do kódu svojej aplikácie.

Pri vytváraní vlastných tried výnimiek sa vždy odvodzujte od triedy Exception a nie od triedy ApplicationException. Jedným z dôvodov je to, že inštancia ApplicationException je vyvolaná aplikáciou a nikdy nie runtime. Vhodením inštancie ApplicationException do kódu by ste iba zvýšili zásobník hovorov bez pridania väčšej hodnoty.

Používanie spracovania výnimiek na vrátenie informácií z metódy je zlým dizajnovým prístupom. Ak vraciate údaje výnimky z vašej metódy, návrh vašej triedy je nesprávny a mal by sa znova navštíviť. Upozorňujeme, že výnimky sú prebublávané až na vyššiu úroveň v hierarchii volaní metód a nie je dobrým zvykom zaobchádzať s výnimkami vo všetkých vrstvách vašej aplikácie. S výnimkou by ste mali manipulovať čo najvyššie v hierarchii hovorov - výnimku môžete stráviť v prezentačnej vrstve a zobraziť príslušné správy používateľovi, aby upozornil na presnú chybu, ktorá sa vyskytla.

Ak chcete vrátiť transakciu z databázy späť, je potrebné opätovné použitie výnimky. Pri písaní obslužných rutín výnimiek je dobré používať špecifické výnimky ako FileNotFoundException, IOException atď. A potom všeobecný blok úlovkov na konci triedy Exception. Takto by ste sa dozvedeli presnú chybu alebo konkrétnu chybu, ktorá sa vyskytla. MSDN uvádza: "Trieda ApplicationException neposkytuje informácie o príčinách výnimiek. Vo väčšine scenárov by inštancie tejto triedy nemali byť vyhodené. V prípadoch, keď je táto trieda vytvorená, by mala byť zaslaná ľudsky čitateľná správa popisujúca chybu." prešlo na konštruktéra. ““

Na spracovanie výnimiek by ste mali použiť bloky try - catch a blok na vyčistenie zdrojov použitých vo vašom programe. Blok try by obsahoval kód, ktorý by mohol vyvolať výnimku, blok catch sa použije na spracovanie výnimky vyvolanej vo vnútri bloku try a blok konečne sa použije na uvoľnenie prostriedkov, ktoré program použil. Upozorňujeme, že je zaručené, že sa blok konečne vykoná bez ohľadu na to, či došlo k výnimke alebo nie. Preto je konečne blok najlepším miestom vo vašom kóde na vyčistenie zdrojov, ktoré váš program použil.

Fragment kódu nižšie ukazuje, ako je možné pomocou výrazu „using“ disponovať so zdrojmi. Upozorňujeme, že príkaz „using“ je ekvivalentom bloku try - konečne.

verejný čítaný reťazec (reťazec názov súboru)

{

skús

{

údaje reťazca;

pomocou (StreamReader streamReader = nový StreamReader (názov súboru))

{

data = streamReader.ReadToEnd ();

}

návratové údaje;

}

úlovok (výnimka)

{

hod;

}

}

Vyhadzovanie výnimiek je drahé. Je nesprávnym zvykom premieňať výnimky - pri opätovnom generovaní výnimiek by ste stratili stopu zásobníka.

skús

{

// Niektorý kód, ktorý by mohol spôsobiť výnimku

}

úlovok (výnimka okrem)

{

hodiť ex;

}

Namiesto toho stačí použiť príkaz „hodiť“, ak chcete vo svojom obslužnom programe výnimiek nespracovať výnimku a v hierarchii hovorov ju šíriť smerom nahor.

skús

{

// Niektorý kód, ktorý by mohol spôsobiť výnimku

}

úlovok (výnimka okrem)

{

hod;

}

Nikdy neprehĺtajte výnimky - nikdy by ste nemali skrývať chybu, ktorá sa vyskytla. Je dobrým zvykom zaznamenávať do svojej aplikácie výnimky. Pri protokolovaní výnimiek by ste mali vždy prihlásiť inštanciu výnimky, aby sa protokolovalo úplné sledovanie zásobníka, a nie iba správa o výnimke. Toto je príklad, ktorý to ilustruje.

skús

{

// Niektorý kód, ktorý by mohol spôsobiť výnimku

}

úlovok (výnimka okrem)

{

LogManager.Log (ex.ToString ());

}

Nikdy by ste nemali používať výnimky na šírenie alebo vykonávanie obchodných pravidiel vo svojej aplikácii. Môžete sa vyhnúť výnimkám v kóde použitím správnej logiky overovania. Vo väčšine prípadov by ste sa mali vyhnúť výnimkám - mali by ste ich používať iba v nevyhnutných prípadoch.

Ďalšie informácie nájdete v tomto článku na webe MSDN.

$config[zx-auto] not found$config[zx-overlay] not found