Sök…


Anmärkningar

TRY / CATCH är ett språkkonstrukt specifikt för MS SQL Server's T-SQL.

Det tillåter felhantering inom T-SQL, liknande det som ses i .NET-kod.

Transaktion i en TRY / CATCH

Detta kommer att återuppta båda infogningarna på grund av en ogiltig datatid:

BEGIN TRANSACTION
BEGIN TRY
    INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
    VALUES (5.2, GETDATE(), 1)
    INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
    VALUES (5.2, 'not a date', 1)
    COMMIT TRANSACTION
END TRY
BEGIN CATCH        
    ROLLBACK TRANSACTION -- First Rollback and then throw.
    THROW
END CATCH

Detta kommer att begå båda insatserna:

BEGIN TRANSACTION
BEGIN TRY
    INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
    VALUES (5.2, GETDATE(), 1)
    INSERT INTO dbo.Sale(Price, SaleDate, Quantity)
    VALUES (5.2, GETDATE(), 1)
    COMMIT TRANSACTION
END TRY
BEGIN CATCH
    THROW
    ROLLBACK TRANSACTION
END CATCH

Öka fel i try-catch blocket

RAISERROR-funktionen genererar fel i TRY CATCH-blocket:

DECLARE @msg nvarchar(50) = 'Here is a problem!'
BEGIN TRY
    print 'First statement';
    RAISERROR(@msg, 11, 1);
    print 'Second statement';
END TRY
BEGIN CATCH
    print 'Error: ' + ERROR_MESSAGE();
END CATCH

RAISERROR med en andra parameter större än 10 (11 i detta exempel) kommer att stoppa exekveringen i TRY BLOCK och höja ett fel som kommer att hanteras i CATCH-blocket. Du kan komma åt felmeddelandet med funktionen ERROR_MESSAGE (). Resultatet av detta prov är:

First statement
Error: Here is a problem!

Att höja informationsmeddelanden i try catch catch block

RAISERROR med svårighetsgrad (andra parameter) mindre eller lika med 10 kommer inte att kasta undantag.

BEGIN TRY
    print 'First statement';
    RAISERROR( 'Here is a problem!', 10, 15);
    print 'Second statement';
END TRY
BEGIN CATCH    
    print 'Error: ' + ERROR_MESSAGE();
END CATCH

Efter RAISERROR-uttalandet kommer tredje uttalandet att köras och CATCH-blocket kommer inte att åberopas. Resultat av utförandet är:

First statement
Here is a problem!
Second statement

Omkastningsundantag genererat av RAISERROR

Du kan kasta felet som du får i CATCH-blocket med hjälp av TRHOW-uttalande:

DECLARE @msg nvarchar(50) = 'Here is a problem! Area: ''%s'' Line:''%i'''
BEGIN TRY
    print 'First statement';
    RAISERROR(@msg, 11, 1, 'TRY BLOCK', 2);
    print 'Second statement';
END TRY
BEGIN CATCH
    print 'Error: ' + ERROR_MESSAGE();
    THROW;
END CATCH

Observera att i detta fall gör vi fel med formaterade argument (fjärde och femte parameter). Det kan vara användbart om du vill lägga till mer information i meddelandet. Resultat av utförandet är:

First statement
Error: Here is a problem! Area: 'TRY BLOCK' Line:'2'
Msg 50000, Level 11, State 1, Line 26
Here is a problem! Area: 'TRY BLOCK' Line:'2'

Kasta undantag i TRY / CATCH-block

Du kan kasta undantag i försök att fånga block:

DECLARE @msg nvarchar(50) = 'Here is a problem!'
BEGIN TRY
    print 'First statement';
    THROW 51000, @msg, 15;
    print 'Second statement';
END TRY
BEGIN CATCH
    print 'Error: ' + ERROR_MESSAGE();
    THROW;
END CATCH

Undantag med hanteras i CATCH-blocket och kastas sedan igen med THROW utan parametrar.

First statement
Error: Here is a problem!
Msg 51000, Level 16, State 15, Line 39
Here is a problem!

THROW liknar RAISERROR med följande skillnader:

  • Rekommendationen är att nya applikationer ska använda THROW istället för RASIERROR.
  • THROW kan använda valfritt nummer som första argument (felnummer), RAISERROR kan bara använda id i sys.messages view
  • THROW har svårighetsgrad 16 (kan inte ändras)
  • THROW kan inte formatera argument som RAISERROR. Använd FORMATMESSAGE-funktionen som ett argument för RAISERROR om du behöver den här funktionen.


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow