Strukturált kivételkezelés implementálása
Most, hogy megismerte a hibák természetét és az alapszintű hibakezelést a T-SQL-ben, ideje áttekinteni a hibakezelés egy fejlettebb formáját. A strukturált kivételkezelés az SQL Server 2005-ben lett bevezetve.
Itt megtudhatja, hogyan használhatja és értékelheti annak előnyeit és korlátait, beleértve a TRY CATCH blokkot, a hibakezelési függvények szerepét, valamint a fogható és a nem kezelhető hibák közötti különbséget. Végül látni fogja, hogyan kezelhetők és felszínre hozhatók a hibák, ha szükséges.
Mi a TRY/CATCH blokkprogramozás?
A strukturált kivételkezelés hatékonyabb, mint a hibakezelés a @@ERROR rendszerváltozó alapján. Lehetővé teszi, hogy megakadályozza, hogy a kód tele legyen hibakezelő kóddal, és központosítsa a hibakezelési kódot. A hibakezelési kód központosítása azt is jelenti, hogy a kód céljára összpontosíthat a benne található hibakezelés helyett.
TRY blokk és CATCH blokk
Strukturált kivételkezelés használatakor a try blokkba kerül az esetlegesen hibát okozó kód. A TRY blokkokat a BEGIN TRY és a END TRY utasítások zárják be.
Ha észlelhető hiba történik – a legtöbb hiba elkapható, a végrehajtás-vezérlés a CATCH blokkba kerül. A CATCH blokk a BEGIN CATCH és a END CATCH utasítások által zárt T-SQL-utasítások sorozata.
Megjegyzés:
Bár a BEGIN CATCH és az END TRY különálló utasítások, a BEGIN CATCH-nek azonnal követnie kell az END TRY.
Jelenlegi korlátozások
A magas szintű nyelvek gyakran kínálnak try/catch/finally szerkezetet, és gyakran használják az erőforrások automatikus felszabadítására. A T-SQL-ben nincs egyenértékű FINALLY blokk.
A megfogható és a nem kezelhető hibák közötti különbség megismerése
Fontos felismerni, hogy bár a TRY/CATCH blokkok lehetővé teszik a hibák sokkal szélesebb körének elfogását, mint @@ERROR, nem tud minden típust elkapni.
Elkapható és el nem kapható hibák
A TRY/CATCH blokkok nem minden hibát képesek elkapni ugyanabban a hatókörben, ahol a TRY/CATCH blokk létezik. Gyakran előfordul, hogy az ugyanabban a hatókörben nem fogott hibák egy környező hatókörbe kerülnek. Előfordulhat például, hogy nem tud hibát kapni a TRY/CATCH blokkot tartalmazó tárolt eljárásban. Azonban valószínűleg elkapja ezt a hibát egy TRY/CATCH blokkban abban a kódban, amely meghívta a tárolt eljárást, ahol a hiba történt.
Gyakori nem módosítható hibák
A nem módosítható hibák gyakori példái a következők:
- Fordítási hibák, például szintaxishibák, amelyek megakadályozzák a batch fájl fordítását.
- Az utasításszintű újrafordítással kapcsolatos problémák, amelyek általában a késleltetett névfeloldással kapcsolatosak. Létrehozhat például egy ismeretlen táblára hivatkozó tárolt eljárást. Hiba csak akkor jelenik meg, ha az eljárás megpróbálja feloldani a tábla nevét egy objektumazonosítóra.
Hibák újradobása a THROW használatával
Ha a THROW utasítást paraméterek nélkül használják a CATCH blokkban, az újra meg fogja jeleníteni azt a hibát, amely miatt a kód belépett a CATCH blokkba. Ezzel a technikával hibanaplózást valósíthat meg az adatbázisban a hibák észlelésével és a részletek naplózásával, majd az eredeti hiba az ügyfélalkalmazásba való beírásával, hogy az ott kezelhető legyen.
Íme egy példa egy hiba újbóli megismétlésére.
BEGIN TRY
-- code to be executed
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE();
THROW
END CATCH
Az SQL Server néhány korábbi verziójában nem volt módszer a rendszerhibák kiírására. Bár a THROW nem tud megadni egy konkrét rendszerhibát, ha a THROW paraméterek nélkül van használva egy CATCH blokkban, mind a rendszer-, mind a felhasználói hibákat újra feldobja.
Mik azok a hibakezelő függvények?
A CATCH blokkok a catch blokk teljes időtartama alatt elérhetővé teszik a hibával kapcsolatos információkat. Ide tartoznak a CATCH blokkból futtatott alhatókörök, például a tárolt eljárások.
Hibakezelési függvények
Ne feledje, hogy a @@ERROR programozása során az @@ERROR rendszerváltozó által tárolt érték a következő utasítás végrehajtása után azonnal alaphelyzetbe állt.
A T-SQL-ben a strukturált kivételkezelés másik fő előnye, hogy számos hibakezelő függvényt biztosítottak, amelyek a CATCH blokkban megőrzik értékeiket. A különálló függvények a felmerült hiba minden tulajdonságát biztosítják.
Ez azt jelenti, hogy írhat általános hibakezelési tárolt eljárásokat, amelyek továbbra is hozzáférhetnek a hibával kapcsolatos információkhoz.
- A CATCH blokkok a catch blokk teljes időtartama alatt elérhetővé teszik a hibával kapcsolatos információkat.
- @@Error alaphelyzetbe áll a következő utasítás futtatásakor.
Kódhibák kezelése
Az SQL CLR-integráció lehetővé teszi a felügyelt kód végrehajtását az SQL Serveren belül. A magas szintű .NET-nyelvek, például a C# és a VB részletes kivételkezeléssel rendelkeznek. A hibákat a standard .NET try/catch/finally blokkok használatával el lehet kapni.
Hibák a felügyelt kódban
Általában érdemes lehet a lehető legnagyobb mértékben elkapni a hibákat a felügyelt kódban. Fontos azonban felismerni, hogy a felügyelt kódban nem kezelt hibák visszakerülnek a hívó T-SQL-kódba. Bármikor, amikor a felügyelt kódban egy hiba lép fel, és az visszajut az SQL Serverhez, 6522-es hibának fog megjelenni. A hibák beágyazhatók, és ez a hiba elfedi a hiba valódi okát.
A felügyelt kódban előforduló hibák egy másik ritka, de lehetséges oka az lenne, hogy a kód végrehajthat egy RAISERROR T-SQL utasítást egy SqlCommand objektumon keresztül.