Microsoft SQL Server
PROBEREN TE VANGEN
Zoeken…
Opmerkingen
TRY / CATCH is een taalconstructie die specifiek is voor de T-SQL van MS SQL Server.
Het maakt foutafhandeling binnen T-SQL mogelijk, vergelijkbaar met die in .NET-code.
Transactie in een TRY / CATCH
Hiermee worden beide invoegingen ongedaan gemaakt vanwege een ongeldige datetime:
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
Hiermee worden beide invoegingen vastgelegd:
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
Raising fouten in try-catch blok
RAISERROR-functie genereert een fout in het TRY CATCH-blok:
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 met tweede parameter groter dan 10 (11 in dit voorbeeld) stopt de uitvoering in PROBEERBLOK en veroorzaakt een fout die in het CATCH-blok wordt afgehandeld. U kunt een foutbericht openen met de functie ERROR_MESSAGE (). De output van dit monster is:
First statement
Error: Here is a problem!
Infoberichten verhogen in blokkering proberen
RAISERROR met ernst (tweede parameter) kleiner of gelijk aan 10 zal geen uitzondering veroorzaken.
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
Na de RAISERROR-instructie wordt de derde instructie uitgevoerd en wordt het CATCH-blok niet aangeroepen. Resultaat van uitvoering is:
First statement
Here is a problem!
Second statement
Hernieuwde uitzondering gegenereerd door RAISERROR
U kunt de fout die u vangt in het CATCH-blok opnieuw gooien met de instructie TRHOW:
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
Merk op dat we in dit geval fouten maken met opgemaakte argumenten (vierde en vijfde parameter). Dit kan handig zijn als u meer info in het bericht wilt toevoegen. Resultaat van uitvoering is:
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'
Uitzondering gooien in TRY / CATCH-blokken
Je kunt een uitzondering in het try-catch-blok gooien:
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
Uitzondering met afgehandeld in CATCH-blok en vervolgens opnieuw gegooid met behulp van Gooien zonder parameters.
First statement
Error: Here is a problem!
Msg 51000, Level 16, State 15, Line 39
Here is a problem!
THROW is vergelijkbaar met RAISERROR met de volgende verschillen:
- Aanbeveling is dat nieuwe toepassingen THROW moeten gebruiken in plaats van RASIERROR.
- THROW kan elk nummer als eerste argument gebruiken (foutnummer), RAISERROR kan alleen id's gebruiken in de weergave sys.messages
- THROW heeft ernst 16 (kan niet worden gewijzigd)
- THROW kan geen argumenten zoals RAISERROR opmaken. Gebruik de FORMATMESSAGE-functie als argument van RAISERROR als u deze functie nodig hebt.