Implementere strukturert unntakshåndtering

Fullført

Nå som du har en forståelse av feil og grunnleggende feilbehandling i T-SQL, er det på tide å se på en mer avansert form for feilbehandling. Strukturert unntaksbehandling ble innført i SQL Server 2005.

Her ser du hvordan du bruker den og evaluerer fordelene og begrensningene, inkludert TRY CATCH-blokken, rollen som feilbehandlingsfunksjoner og forståelse av forskjellen mellom catchable og ikke-catchable-feil. Til slutt ser du hvordan feil kan håndteres og vises når det er nødvendig.

Hva er TRY/CATCH-blokkprogrammering

Strukturert unntaksbehandling er kraftigere enn feilhåndtering basert på @@ERROR systemvariabel. Den lar deg forhindre at kode blir strødd med feilhåndteringskode og sentralisere feilbehandlingskoden. Sentralisering av feilhåndteringskode betyr også at du kan fokusere mer på formålet med koden i stedet for feilbehandlingen den inneholder.

PRØV blokk- og CATCH-blokk

Når du bruker strukturert unntaksbehandling, plasseres kode som kan oppstå i en TRY-blokk. TRY-blokker omsluttes av BEGIN TRY - og END TRY-setninger .

Hvis det oppstår en feil som kan fanges opp - de fleste feil kan fanges opp, flyttes kjøringskontrollen til CATCH-blokken. CATCH-blokken er en serie med T-SQL-setninger omsluttet av BEGIN CATCH - og END CATCH-setninger .

Merk deg

Mens BEGIN CATCH og END TRY er separate setninger, må BEGIN CATCH umiddelbart følge END TRY.

Gjeldende begrensninger

Språk på høyt nivå tilbyr ofte en prøve-/fangst/endelig-konstruksjon, og brukes ofte til å frigi ressurser implisitt. Det finnes ingen tilsvarende ENDELIG-blokk i T-SQL.

Forstå forskjellen mellom catchable og ikke-catchable feil

Det er viktig å innse at selv om TRY/CATCH-blokker lar deg fange opp et mye bredere spekter av feil enn du kunne med @@ERROR, kan du ikke fange opp alle typer.

Catchable vs. ikke-kjedbare feil

Ikke alle feil kan fanges opp av TRY/CATCH-blokker innenfor samme omfang der TRY/CATCH-blokken finnes. Ofte kan feil som ikke kan fanges opp i samme omfang, fanges opp i et omkringliggende omfang. Du kan for eksempel ikke fange opp en feil i den lagrede prosedyren som inneholder TRY/CATCH-blokken. Det er imidlertid sannsynlig at du vil fange denne feilen i en TRY/CATCH-blokk i koden som kalte den lagrede prosedyren der feilen oppstod.

Vanlige feil som ikke kan kjedes

Vanlige eksempler på feil som ikke kan brukes, er:

  • Kompileringsfeil, for eksempel syntaksfeil, som hindrer en gruppe i å kompilere.
  • Rekompileringsproblemer på setningsnivå som vanligvis er relatert til utsatt navneoppløsning. Du kan for eksempel opprette en lagret prosedyre som refererer til en ukjent tabell. Det oppstår bare en feil når prosedyren prøver å løse navnet på tabellen til en objectid.

Slik setter du inn feil på nytt ved hjelp av THROW

Hvis THROW-setningen brukes i en CATCH-blokk uten parametere, vil den rethrow feilen som forårsaket koden til å skrive inn CATCH-blokken. Du kan bruke denne teknikken til å implementere feillogging i databasen ved å fange opp feil og logge detaljene deres, og deretter kaste den opprinnelige feilen til klientprogrammet, slik at den kan håndteres der.

Her er et eksempel på hvordan du gjenoppretter en feil.

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

I noen tidligere versjoner av SQL Server var det ingen metode for å kaste en systemfeil. Selv om THROW ikke kan angi en systemfeil som skal opphøyes, vil den reraise både system- og brukerfeil når THROW brukes uten parametere i en CATCH-blokk.

Hva er feilhåndteringsfunksjoner

CATCH-blokker gjør feilrelatert informasjon tilgjengelig i løpet av CATCH-blokken. Dette inkluderer delskoper, for eksempel lagrede prosedyrer, som kjøres fra CATCH-blokken.

Feilbehandlingsfunksjoner

Du bør huske at når du programmerer med @@ERROR, ble verdien holdt av @@ERROR systemvariabel tilbakestilt så snart neste setning ble utført.

En annen viktig fordel med strukturert unntakshåndtering i T-SQL er at en rekke feilhåndteringsfunksjoner er angitt, og at disse beholder verdiene i hele CATCH-blokken. Separate funksjoner gir hver egenskap av en feil som er opphøyd.

Dette betyr at du kan skrive generisk feilbehandling av lagrede prosedyrer som fortsatt har tilgang til feilrelatert informasjon.

  • CATCH-blokker gjør feilrelatert informasjon tilgjengelig i løpet av CATCH-blokken.
  • @@Error tilbakestilles når neste setning kjøres.

Behandle feil i kode

SQL CLR-integrasjon gjør det mulig å kjøre administrert kode i SQL Server. Høye .NET-språk, for eksempel C# og VB, har detaljert unntakshåndtering tilgjengelig for dem. Feil kan fanges opp ved hjelp av standard .NET-forsøk/oppfang/til slutt-blokker.

Feil i forvaltet kode

Generelt sett kan det hende du ønsker å fange opp feil i administrert kode så mye som mulig. Det er imidlertid viktig å innse at eventuelle feil som ikke håndteres i den administrerte koden, sendes tilbake til den kallende T-SQL-koden. Når en feil som oppstår i administrert kode returneres til SQL Server, ser det ut til å være en 6522-feil. Feil kan nestes, og den bestemte feilen vil bryte den virkelige årsaken til feilen.

En annen sjelden, men mulig årsak til feil i forvaltet kode er at koden kan kjøre en RAISERROR T-SQL-setning via et SqlCommand-objekt.