Recherche…


Remarques

TRY / CATCH est une construction de langage spécifique à T-SQL de MS SQL Server.

Il permet la gestion des erreurs dans T-SQL, similaire à celle observée dans le code .NET.

Transaction dans un TRY / CATCH

Cela annulera les deux insertions en raison d'un datetime non valide:

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

Cela va valider les deux insertions:

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

Augmenter les erreurs dans le bloc try-catch

La fonction RAISERROR générera une erreur dans le bloc TRY CATCH:

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 avec un deuxième paramètre supérieur à 10 (11 dans cet exemple) arrêtera l'exécution dans TRY BLOCK et générera une erreur qui sera traitée dans le bloc CATCH. Vous pouvez accéder à un message d'erreur à l'aide de la fonction ERROR_MESSAGE (). La sortie de cet échantillon est la suivante:

First statement
Error: Here is a problem!

Envoyer des messages d'information dans try catch block

RAISERROR avec sévérité (deuxième paramètre) inférieure ou égale à 10 ne lancera pas d'exception.

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

Après l'instruction RAISERROR, la troisième instruction sera exécutée et le bloc CATCH ne sera pas appelé. Le résultat de l'exécution est le suivant:

First statement
Here is a problem!
Second statement

Exception de relance générée par RAISERROR

Vous pouvez relancer l'erreur que vous rencontrez dans le bloc CATCH en utilisant l'instruction 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

Notez que dans ce cas, nous soulevons une erreur avec des arguments formatés (quatrième et cinquième paramètre). Cela peut être utile si vous souhaitez ajouter plus d'informations dans le message. Le résultat de l'exécution est le suivant:

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'

Lancer une exception dans les blocs TRY / CATCH

Vous pouvez lancer une exception dans try catch 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

Exception avec être traité dans le bloc CATCH, puis renvoyé en utilisant THROW sans paramètres.

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

THROW est similaire à RAISERROR avec les différences suivantes:

  • Il est recommandé que les nouvelles applications utilisent THROW au lieu de RASIERROR.
  • THROW peut utiliser n'importe quel nombre comme premier argument (numéro d'erreur), RAISERROR ne peut utiliser que des identifiants dans la vue sys.messages
  • THROW a la gravité 16 (ne peut pas être modifié)
  • THROW ne peut pas formater des arguments comme RAISERROR. Utilisez la fonction FORMATMESSAGE comme argument de RAISERROR si vous avez besoin de cette fonctionnalité.


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow