TRY…CATCH

BEGIN TRY
{ sql_statement | statement_block }
END TRY
BEGIN CATCH
[ { sql_statement | statement_block } ]
END CATCH
[ ; ]

Blocken TRY…CATCH används för felhantering. Det går ut på att man samlar alla uttryck eller satser innanför ett block med TRY och gör ett försök att köra dem. Efter det blocket har man alltid ett block med CATCH och koden där körs om något går fel i försöket. Innanför CATCH-blocket lägger man bl a ROLLBACK TRANSACTION när man använder transaktioner och systemfunktioner som ERROR_MESSAGE().

TRY

För att lägga till felhantering behöver du tala om för SQL-server att du vill försöka köra lite kod och det gör du genom att börja med satsen BEGIN TRY. Sedan skriver du de satser som du vill testa och när du är klar med försöket avslutar du med satsen END TRY.

BEGIN TRY
    BEGIN TRANSACTION AddPerson 
        INSERT INTO Personer
            (Name, Phone, City)
        VALUES
            ('Suzanne Apelqvist', '070-333 222 11', 'Örnsköldsvik')
    COMMIT TRANSACTION AddPerson 
    PRINT 'Personen är tillagd'
END TRY

CATCH

Ett block med TRY fyller ingen större funktion utan ett block med CATCH.  Med CATCH fångar du upp alla fel som uppstår i försöket. Mellan BEGIN CATCH och END CATCH skriver du instruktioner om vad som ska ske när det blir fel. I nedanstående exempel har jag använt mig av systemfunktionen ERROR_MESSAGE(), som skriver ut ett tydligare meddelande om vad som gick fel och ROLLBACK TRANSACTION för att ångra händelserna i transaktionen. Fler systemfunktioner för felhantering finner du längre ner på sidan.

BEGIN CATCH
    ROLLBACK TRANSACTION AddPerson
    select ERROR_MESSAGE() AS FelMeddelande;
END CATCH

TRY…CATCH

Här är ett exempel med båda blocken TRY…CATCH.

BEGIN TRY
    BEGIN TRANSACTION AddPerson 
        INSERT INTO Personer
            (Name, Phone, City)
        VALUES
            ('Suzanne Apelqvist', '070-333 222 11', 'Örnsköldsvik')
    COMMIT TRANSACTION AddPerson 
    PRINT 'Personen är tillagd'
END TRY

BEGIN CATCH
    ROLLBACK TRANSACTION AddPerson
    select ERROR_MESSAGE() AS FelMeddelande;
END CATCH

Satsen innanför blocket BEGIN TRY och END TRY kommer att utföras om inget är fel. Annars körs satsen innanför blocket BEGIN CATCH och END CATCH.

Systemfunktioner

  • ERROR_NUMBER()
    Returnerar antalet fel.
  • ERROR_SEVERITY()
    Returnerar the severity.
  • ERROR_STATE()
    Returnerar the error state number.
  • ERROR_PROCEDURE()
    Returnerar namnet på den lagrade proceduren eller trigger där felet uppstod.
  • ERROR_LINE()
    Returnerar radnumret inuti rutinen som orsakade felet.
  • ERROR_MESSAGE()
    Returnerar hela texten för felmeddelandet.

Kommentera

E-postadressen publiceras inte. Obligatoriska fält är märkta *