Strukturált kivételkezelés implementálása

Befejeződött

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.