utiliser RAISERROR avec THROW pour lancer une erreur système SQL Server

Classé dans : Articles | 0

THROW remplace RAISERROR dans SQL Server et c’est la méthode préférée pour générer des messages d’erreur et les pousser vers le code appelant. THROW est en fait beaucoup plus intuitif que RAISERROR en ce qui concerne la façon dont votre code y répond.

THROW a été créé pour correspondre plus étroitement au code de gestion des erreurs dans les langages de programmation actuels. RAISERROR existe depuis 1998, d’abord publié dans SQL Server 7.0., THROW a d’abord été inclus dans SQL Server 2012.

RAISERROR est toujours inclus dans les versions actuelles de SQL Server, mais il existe des différences notables entre la façon dont le SQL circule lorsque RAISERROR est appelé et lorsque THROW est appelé. Plus précisément, RAISERROR n’arrête pas l’exécution de la procédure en cours, tandis que THROW arrête toujours la procédure en cours et transmet l’erreur à la procédure appelante.

THROW like RAISERROR vous permet de « soulever” des erreurs personnalisées, mais il arrête immédiatement le processus en cours et renvoie l’erreur à la procédure d’appel.,

THROW vous permet de faire à peu près tout ce que RAISERROR a permis, à une exception notable: THROW ne vous permet pas de générer des erreurs système SQL Server. Mais si vous devez lancer une erreur système, vous pouvez toujours le faire en utilisant D’abord RAISERROR dans un bloc TRY et en utilisant THROW dans le bloc CATCH correspondant pour lancer l’erreur système.

exemple:

–l’instruction suivante entraîne une erreur car THROW ne peut pas lancer d’exceptions système:
THROW 40655, ‘le maître de base de données ne peut pas être restauré.,’, 1;

résultats:

Msg 35100, niveau 16, État 10, Ligne 2
Le numéro d’erreur 40655 dans L’instruction THROW est en dehors de la plage valide. Spécifiez un numéro d’erreur dans la plage valide de 50000 à 2147483647.

Mais vous pouvez contourner cette limitation de THROW de ne pas pouvoir lancer d’exceptions système en l’utilisant conjointement avec RAISERROR dans un bloc TRY/CATCH:

–Throw system exception en utilisant RAISERROR d’abord dans un bloc TRY / CATCH.,
BEGIN TRY
PRINT ‘Begin Try’;
RAISERROR (40655, 16, 1);
PRINT ‘End Try’;
END TRY

BEGIN CATCH
PRINT ‘Begin Catch / Before Throwing Error’;
THROW;
PRINT ‘End Catch / After Throwing Error’;
end CATCH;

PRINT ‘After Try/Catch’;

résultats:

Begin Try
BEGIN catch / before throwing error
msg 40655, niveau 16, état 1, ligne 3
La base de données ‘master’ ne peut pas être restaurée.,

comme vous pouvez le voir dans les résultats, RAISERROR n’arrête pas le flux de processus mais vous permet de soulever les erreurs système et THROW arrête le flux de processus et vous permet de lancer les erreurs système que vous soulevez avec RAISERROR au processus appelant. L’utilisation des deux instructions ensemble vous permet d’avoir un contrôle total des messages d’erreur et du moment où ils sont renvoyés à la procédure d’appel.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *