Jäsennettyjen poikkeusten käsittelyn toteuttaminen
Nyt kun ymmärrät virheiden luonteen ja virheenkäsittelyn perusasiat T-SQL:ssä, on aika tarkastella kehittyneempää virheenkäsittelyn muotoa. Jäsennetty poikkeusten käsittely otettiin käyttöön SQL Server 2005:ssä.
Tässä näet, miten voit käyttää sitä ja arvioida sen etuja ja rajoituksia, kuten TRY CATCH -lohkon, virheenkäsittelyfunktioiden roolin sekä ymmärtämään siepattavien ja korjaamattomien virheiden välisen eron. Näet lopuksi, miten virheitä voidaan hallita ja esitellä tarvittaessa.
Mikä on TRY/CATCH-lohkoohjelmointi?
Jäsennetyjen poikkeusten käsittely on tehokkaampaa kuin virheiden käsittely järjestelmämuuttujan @@ERROR perusteella. Sen avulla voit estää koodin roskaamisen virheenkäsittelykoodilla ja keskittää tämän virheenkäsittelykoodin. Koodin keskittäminen tarkoittaa myös sitä, että voit keskittyä enemmän koodin tarkoitukseen kuin sen sisältämään virheiden käsittelyyn.
TRY-lohko ja CATCH-lohko
Kun käytetään jäsennettyjen poikkeusten käsittelyä, koodi, joka saattaa aiheuttaa virheen, sijoitetaan TRY-lohkoon. TRY-lohkot on sisällytetty BEGIN TRY - ja END TRY - lausekkeisiin.
Jos siepattava virhe ilmenee - useimmat virheet voidaan saada kiinni, suorituksen hallinta siirtyy CATCH-lohkoon. CATCH-lohko on sarja T-SQL-lausekkeita, jotka on sisällytetty BEGIN CATCH - ja END CATCH -lausekkeisiin.
Huomautus
Vaikka BEGIN CATCH ja END TRY ovat erillisiä lausekkeita, BEGIN CATCH -lausekkeen on heti seurattava END TRY -parametria.
Nykyiset rajoitukset
Korkean tason kielet tarjoavat usein try/catch/finally-rakenteen, ja niitä käytetään usein resurssien implisiittiseen vapauttamiseen. T-SQL:ssä ei ole vastaavaa FINALLY-lohkoa.
Opit ymmärtämään sietämättömien ja korjaamattomien virheiden välisen eron.
On tärkeää ymmärtää, että vaikka TRY/CATCH-lohkojen avulla voit saada paljon laajemman valikoiman virheitä kuin @@ERROR, et voi saada kiinni kaikenlaisia.
Siepattavissa olevat vs. korjaamattomat virheet
Kaikki virheet eivät jää TRY/CATCH-lohkojen alle samalla alueella kuin TRY/CATCH-lohko. Usein virheet, joita ei voida saada kiinni samalla vaikutusalueella, voidaan saada ympäröivään laajuuteen. Et ehkä esimerkiksi saa virhettä tallennetussa toimintosarjassa, joka sisältää TRY/CATCH-lohkon. Virhe kuitenkin todennäköisesti tulee näkyviin TRY/CATCH-lohkossa koodissa, joka kutsui tallennettua toimintosarjaa, jossa virhe ilmeni.
Yleisiä virheitä, jotka eivät ole sikoja
Esimerkkejä virheistä, joita ei voi korjata, ovat seuraavat:
- Käännä virheitä, kuten syntaksivirheitä, jotka estävät erän kääntämisen.
- Lauseketason uudelleenmuodostamisongelmat, jotka yleensä liittyvät lykkäyksen nimien ratkaisuun. Voit esimerkiksi luoda tallennetun toimintosarjan, joka viittaa tuntemattomaan taulukkoon. Virhe palautetaan vain, kun toimintosarja yrittää ratkaista taulukon nimen objectid-nimeksi.
Kuinka luoda virheitä uudelleen THROW-toiminnolla
Jos THROW-lauseketta käytetään CATCH-lohkossa ilman parametreja, se luo uudelleen virheen, joka aiheutti koodin syöttämisen CATCH-lohkoon. Tämän menetelmän avulla voit ottaa käyttöön virheenkirjauksen tietokannassa kiinniottamalla virheitä ja kirjaamalla niiden tiedot ja antamalla sitten alkuperäisen virheen asiakassovellukselle, jotta sitä voidaan käsitellä siellä.
Tässä on esimerkki siitä, miten voit muodostaa virheen uudelleen.
BEGIN TRY
-- code to be executed
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE();
THROW
END CATCH
Joissain SQL Serverin aiemmissa versioissa ei ollut menetelmää järjestelmävirheen lisääminen. Vaikka THROW ei pysty määrittämään järjestelmävirhettä, joka pitäisi nostaa esiin, kun THROW-funktiota käytetään ilman parametreja CATCH-lohkossa, se tekee uudelleen sekä järjestelmä- että käyttäjävirheet.
Mitä ovat virheenkäsittelyfunktiot?
CATCH-lohkot antavat virheisiin liittyvät tiedot käytettäviksi CATCH-lohkon koko keston ajan. Tämä sisältää aliskoopit, kuten tallennetut menettelyt, jotka suoritetaan CATCH-lohkon sisältä.
Virheenkäsittelyfunktiot
Muista, että kun ohjelmointi @@ERROR, @@ERROR järjestelmämuuttujan hallussa oleva arvo nollattiin heti, kun seuraava lauseke on suoritettu.
T-SQL:n jäsennetyn poikkeusten käsittelyn keskeisenä etuna on se, että on annettu useita virheenkäsittelyfunktioita, jotka säilyttävät arvonsa koko CATCH-lohkossa. Erilliset funktiot antavat esiin nostetun virheen jokaisen ominaisuuden.
Tämä tarkoittaa sitä, että voit kirjoittaa yleisen virheenkäsittelyn tallennetuille toimintosarjoille, jotka voivat edelleen käyttää virheisiin liittyviä tietoja.
- CATCH-lohkot antavat virheisiin liittyvät tiedot käytettäviksi CATCH-lohkon koko keston ajan.
- @@Error nollataan, kun seuraava lauseke suoritetaan.
Hallitse koodin virheitä
SQL CLR -integrointi mahdollistaa hallitun koodin suorittamisen SQL Serverissä. Korkean tason .NET-kielillä, kuten C#- ja VB-kielillä, on käytettävissään yksityiskohtainen poikkeusten käsittely. Virheitä voidaan saada käyttämällä vakiomuotoista .NET try/catch/finally-lohkoa.
Hallitun koodin virheet
Yleensä haluat ehkä saada hallittuun koodiin kuuluvia virheitä mahdollisimman paljon. On kuitenkin tärkeää ymmärtää, että kaikki virheet, joita ei käsitellä hallitussa koodissa, siirretään takaisin kutsuttavaan T-SQL-koodiin. Kun hallitussa koodissa ilmenneet virheet palautetaan SQL Serveriin, kyseessä saattaa olla 6522-virhe. Virheet voidaan sijoittaa sisäkkäin, ja kyseinen tietty virhe rivittää virheen todellisen syyn.
Toinen harvinainen mutta mahdollinen virheiden syy hallitussa koodissa on se, että koodi voi suorittaa RAISERROR T-SQL -lausekkeen SqlCommand-objektin kautta.