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.


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow