Implementace strukturovaného zpracování výjimek

Dokončeno

Teď, když máte přehled o povaze chyb a základním zpracování chyb v T-SQL, je čas se podívat na pokročilejší formu zpracování chyb. Strukturované zpracování výjimek bylo zavedeno v SQL Serveru 2005.

Tady se dozvíte, jak ho používat a vyhodnotit jeho výhody a omezení, včetně bloku TRY CATCH, role funkcí pro zpracování chyb a pochopení rozdílu mezi zachytitelnými a nečitelnými chybami. Nakonec uvidíte, jak se dají chyby spravovat a zobrazovat v případě potřeby.

Co je programování bloků TRY/CATCH

Strukturované zpracování výjimek je výkonnější než zpracování chyb na základě systémové proměnné @@ERROR. Díky tomu můžete zabránit tomu, aby se kód zahazoval kódem pro zpracování chyb a centralizovat kód pro zpracování chyb. Centralizace kódu pro zpracování chyb také znamená, že se můžete zaměřit spíše na účel kódu než na zpracování chyb, které obsahuje.

Blok TRY a blok CATCH

Při použití strukturovaného zpracování výjimek se kód, který může vyvolat chybu, umístí do bloku TRY. Bloky TRY jsou uzavřeny příkazy BEGIN TRY a END TRY .

Pokud dojde k zachytitelné chybě – většina chyb se dá zachytit, ovládací prvek provádění se přesune do bloku CATCH. Blok CATCH je řada příkazů T-SQL uzavřených příkazy BEGIN CATCH a END CATCH .

Poznámka:

Zatímco BEGIN CATCH a END TRY jsou samostatné příkazy, BEGIN CATCH musí okamžitě postupovat podle příkazu END TRY.

Aktuální omezení

Jazyky vysoké úrovně často nabízejí konstrukci try/catch/finally a používají se k implicitnímu uvolnění prostředků. V T-SQL není žádný ekvivalentní blok FINALLY.

Vysvětlení rozdílu mezi zachytitelnými a nechytitelnými chybami

Je důležité si uvědomit, že zatímco bloky TRY/CATCH umožňují zachytit mnohem širší škálu chyb, než byste mohli s @@ERROR, nemůžete zachytit každý typ.

Zachytitelné a nechytitelné chyby

Ne všechny chyby mohou být zachyceny bloky TRY/CATCH ve stejném oboru, ve kterém existuje blok TRY/CATCH. Chyby, které nelze zachytit ve stejném oboru, je často možné zachytit v okolním oboru. Například možná nebudete moct zachytit chybu v uložené proceduře, která obsahuje blok TRY/CATCH. Pravděpodobně ale tuto chybu zachytíte v bloku TRY/CATCH v kódu, který volal uloženou proceduru, ve které došlo k chybě.

Běžné nekatelné chyby

Mezi běžné příklady chyb, které se nedají zachytovat, patří:

  • Chyby kompilace, jako jsou chyby syntaxe, které brání tomu, aby se dávka zkompilovala.
  • Problémy s rekompilacemi na úrovni příkazů, které obvykle souvisejí s odloženým překladem názvů. Můžete například vytvořit uloženou proceduru, která odkazuje na neznámou tabulku. Chyba se vyvolá pouze v případě, že se procedura pokusí přeložit název tabulky na objectid.

Jak znovu vyvolat chyby pomocí THROW

Pokud se příkaz THROW používá v bloku CATCH bez parametrů, znovu se vrátí chyba, která způsobila zadání bloku CATCH. Tuto techniku můžete použít k implementaci protokolování chyb v databázi zachycením chyb a protokolováním jejich podrobností a následným vyvoláním původní chyby do klientské aplikace, aby bylo možné ji tam zpracovat.

Tady je příklad toho, jak znovu vytvořit chybu.

BEGIN TRY
    -- code to be executed
END TRY
BEGIN CATCH
    PRINT ERROR_MESSAGE();
    THROW
END CATCH

V některých dřívějších verzích SQL Serveru nebyla žádná metoda vyvolání systémové chyby. Funkce THROW sice nemůže určit systémovou chybu, která se má vyvolat, ale když se funkce THROW použije bez parametrů v bloku CATCH, znovu zobrazí systémové i uživatelské chyby.

Co jsou funkce pro zpracování chyb

Bloky CATCH zpřístupní informace související s chybami po celou dobu trvání bloku CATCH. To zahrnuje dílčí rozsahy, jako jsou uložené procedury, spouštěné z bloku CATCH.

Funkce zpracování chyb

Měli byste si vzpomenout, že při programování s @@ERROR byla hodnota uložená systémovou proměnnou @@ERROR resetována ihned po spuštění dalšího příkazu.

Další klíčovou výhodou strukturovaného zpracování výjimek v jazyce T-SQL je, že byla poskytována řada funkcí zpracování chyb a tyto funkce zachovávají jejich hodnoty v celém bloku CATCH. Samostatné funkce uvádějí každou vlastnost chyby, která byla vyvolána.

To znamená, že můžete napsat obecné uložené procedury pro zpracování chyb, které budou mít stále přístup k informacím souvisejícím s chybami.

  • Bloky CATCH zpřístupní informace související s chybami po celou dobu trvání bloku CATCH.
  • @@Error se resetuje při spuštění dalšího příkazu.

Správa chyb v kódu

Integrace SQL CLR umožňuje spouštění spravovaného kódu v RÁMCI SQL Serveru. Jazyky .NET vysoké úrovně, jako jsou C# a VB, mají k dispozici podrobné zpracování výjimek. Chyby lze zachytit pomocí standardních bloků try/catch/finally .NET.

Chyby ve spravovaném kódu

Obecně můžete chtít zachytit chyby v rámci spravovaného kódu co nejvíce. Je ale důležité si uvědomit, že všechny chyby nezpracované ve spravovaném kódu se předávají zpět volajícímu kódu T-SQL. Při každém vrácení jakékoli chyby ve spravovaném kódu do SQL Serveru se zdá, že se jedná o chybu 6522. Chyby mohou být vnořené a konkrétní chyba může zakrývat skutečnou příčinu chyby.

Další vzácnou, ale možnou příčinou chyb ve spravovaném kódu by bylo, že kód by mohl spustit příkaz T-SQL RAISERROR prostřednictvím objektu SqlCommand.