Implementace strukturovaného zpracování výjimek
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.