Microsoft SQL Server
FÖRSÖK FÅNGA
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.