EXCEPTION (Exécution de scripts Snowflake)¶
Spécifie comment traiter les exceptions soulevées dans le bloc Exécution de scripts Snowflake.
Pour plus dâinformations sur les exceptions, voir Traitement des exceptions.
- Voir aussi:
Syntaxe¶
EXCEPTION
WHEN <exception_name> [ OR <exception_name> ... ] THEN
<statement>;
[ <statement>; ... ]
[ WHEN ... ]
[ WHEN OTHER THEN ]
<statement>;
[ <statement>; ... ]
OĂč :
exception_name
Un nom dâexception dĂ©fini dans la partie DECLARE du bloc actuel, ou dans un bloc englobant.
statement
Une instruction peut ĂȘtre lâun des Ă©lĂ©ments suivants :
Une seule instruction SQL (y compris CALL).
Une instruction de flux de contrĂŽle (par exemple, une instruction de bouclage ou de branchement).
Un bloc imbriqué.
Notes sur lâutilisation¶
Chaque bloc peut avoir son propre gestionnaire dâexception.
Snowflake ne prend pas en charge plus dâun gestionnaire dâexception par bloc. Cependant, ce gestionnaire peut dĂ©tecter plusieurs types dâexceptions en ayant plus dâune clause
WHEN
.Le gestionnaire des exceptions doit se trouver Ă la fin du bloc. Si le bloc contient des instructions aprĂšs le gestionnaire dâexception, ces instructions ne sont pas exĂ©cutĂ©es.
La clause
WHEN OTHER THEN
rĂ©cupĂšre toute exception non encore spĂ©cifiĂ©e.Si plus dâune clause
WHEN
peut correspondre Ă une exception spĂ©cifique, câest la premiĂšre clauseWHEN
qui est exĂ©cutĂ©e. Les autres clauses ne sont pas exĂ©cutĂ©es.Un gestionnaire dâexception ne peut traiter une exception spĂ©cifiĂ©e que si cette exception spĂ©cifiĂ©e se trouve dans le scope.
Si une procédure stockée est destinée à renvoyer une valeur, elle doit renvoyer une valeur à partir de chaque chemin possible, y compris chaque clause
WHEN
du gestionnaire dâexception.Pour utiliser une variable dans un gestionnaire dâexceptions, la variable doit ĂȘtre dĂ©clarĂ©e dans la section DECLARE ou passĂ©e en argument Ă une procĂ©dure stockĂ©e. Elle ne peut pas ĂȘtre dĂ©clarĂ©e dans la section BEGIN. .. END. Pour plus dâinformations, voir Passer des variables Ă un gestionnaire dâexceptions.
Exemples¶
Cet exemple déclare, lÚve et gÚre une exception. Remarques importantes :
Le gestionnaire dâexceptions est conçu pour traiter plusieurs types dâexceptions.
Lâune des clauses
WHEN
du gestionnaire dâexception contient une seule instruction, tandis que lâautre contient un bloc.DECLARE RESULT VARCHAR; EXCEPTION_1 EXCEPTION (-20001, 'I caught the expected exception.'); EXCEPTION_2 EXCEPTION (-20002, 'Not the expected exception!'); BEGIN RESULT := 'If you see this, I did not catch any exception.'; IF (TRUE) THEN RAISE EXCEPTION_1; END IF; RETURN RESULT; EXCEPTION WHEN EXCEPTION_2 THEN RETURN SQLERRM; WHEN EXCEPTION_1 THEN RETURN SQLERRM; END;
Remarque : Si vous utilisez Snowflake CLI, SnowSQL, Classic Console, ou la méthode
execute_stream
ouexecute_string
dans le code Connecteur Python, utilisez cet exemple Ă la place (voir Utilisation de Snowflake Scripting dans Snowflake CLI, SnowSQL, le Classic Console et le connecteur Python) :EXECUTE IMMEDIATE $$ DECLARE RESULT VARCHAR; EXCEPTION_1 EXCEPTION (-20001, 'I caught the expected exception.'); EXCEPTION_2 EXCEPTION (-20002, 'Not the expected exception!'); BEGIN RESULT := 'If you see this, I did not catch any exception.'; IF (TRUE) THEN RAISE EXCEPTION_1; END IF; RETURN RESULT; EXCEPTION WHEN EXCEPTION_2 THEN RETURN SQLERRM; WHEN EXCEPTION_1 THEN RETURN SQLERRM; END; $$ ;
Voici le rĂ©sultat de lâexĂ©cution de lâexemple qui soulĂšve lâexception. Cela montre que le gestionnaire dâexceptions a dĂ©celĂ© lâexception.
+----------------------------------+ | anonymous block | |----------------------------------| | I caught the expected exception. | +----------------------------------+
Lâexemple suivant est similaire au prĂ©cĂ©dent, mais prĂ©sente des blocs imbriquĂ©s et montre quâun bloc interne peut soulever une exception dĂ©clarĂ©e soit dans le bloc interne, soit dans un bloc externe.
DECLARE e1 EXCEPTION (-20001, 'Exception e1'); BEGIN -- Inner block. DECLARE e2 EXCEPTION (-20002, 'Exception e2'); selector BOOLEAN DEFAULT TRUE; BEGIN IF (selector) THEN RAISE e1; ELSE RAISE e2; END IF; END; EXCEPTION WHEN e1 THEN RETURN SQLERRM || ' caught in outer block.'; END;Remarque : Si vous utilisez Snowflake CLI, SnowSQL, Classic Console, ou la méthode
execute_stream
ouexecute_string
dans le code Connecteur Python, utilisez cet exemple Ă la place (voir Utilisation de Snowflake Scripting dans Snowflake CLI, SnowSQL, le Classic Console et le connecteur Python) :EXECUTE IMMEDIATE $$ DECLARE e1 EXCEPTION (-20001, 'Exception e1'); BEGIN -- Inner block. DECLARE e2 EXCEPTION (-20002, 'Exception e2'); selector BOOLEAN DEFAULT TRUE; BEGIN IF (selector) THEN RAISE e1; ELSE RAISE e2; END IF; END; EXCEPTION WHEN e1 THEN BEGIN RETURN SQLERRM || ' caught in outer block.'; END; END; $$ ;
Voici le rĂ©sultat de lâexĂ©cution de lâexemple qui soulĂšve lâexception. Cela montre que le gestionnaire dâexceptions a dĂ©celĂ© lâexception.
+-------------------------------------+ | anonymous block | |-------------------------------------| | Exception e1 caught in outer block. | +-------------------------------------+
Lâexemple suivant est similaire Ă lâexemple prĂ©cĂ©dent, mais prĂ©sente des blocs imbriquĂ©s, dont chacun possĂšde son propre gestionnaire dâexceptions.
DECLARE RESULT VARCHAR; e1 EXCEPTION (-20001, 'Outer exception e1'); BEGIN RESULT := 'No error so far (but there will be).'; DECLARE e1 EXCEPTION (-20101, 'Inner exception e1'); BEGIN RAISE e1; EXCEPTION WHEN e1 THEN RESULT := 'Inner exception raised.'; RETURN RESULT; END; RETURN RESULT; EXCEPTION WHEN e1 THEN RESULT := 'Outer exception raised.'; RETURN RESULT; END;Remarque : Si vous utilisez Snowflake CLI, SnowSQL, Classic Console, ou la méthode
execute_stream
ouexecute_string
dans le code Connecteur Python, utilisez cet exemple Ă la place (voir Utilisation de Snowflake Scripting dans Snowflake CLI, SnowSQL, le Classic Console et le connecteur Python) :EXECUTE IMMEDIATE $$ DECLARE RESULT VARCHAR; e1 EXCEPTION (-20001, 'Outer exception e1'); BEGIN RESULT := 'No error so far (but there will be).'; DECLARE e1 EXCEPTION (-20101, 'Inner exception e1'); BEGIN RAISE e1; EXCEPTION WHEN e1 THEN RESULT := 'Inner exception raised.'; RETURN RESULT; END; RETURN RESULT; EXCEPTION WHEN e1 THEN RESULT := 'Outer exception raised.'; RETURN RESULT; END; $$ ;
Note
Cet exemple utilise le mĂȘme nom dâexception (e1
) dans les blocs externe et interne.
Ce nâest pas recommandĂ©.
Lâexemple fait cela pour illustrer le scope des noms dâexception. Les deux exceptions portant le nom e1
sont des exceptions différentes.
Le gestionnaire e1
du bloc externe ne traite pas lâexception e1 qui est dĂ©clarĂ©e et soulevĂ©e dans le bloc interne.
Voici le rĂ©sultat de lâexĂ©cution de lâexemple qui soulĂšve lâexception. Cela montre que le gestionnaire dâexception interne sâest exĂ©cutĂ©.
+-------------------------+ | anonymous block | |-------------------------| | Inner exception raised. | +-------------------------+
Ce fragment dâexemple montre :
Comment dĂ©tecter plus dâune exception dans la mĂȘme clause en utilisant
OR
.Comment détecter des exceptions non spécifiées en utilisant
WHEN OTHER THEN
.EXCEPTION WHEN MY_FIRST_EXCEPTION OR MY_SECOND_EXCEPTION OR MY_THIRD_EXCEPTION THEN RETURN 123; WHEN MY_FOURTH_EXCEPTION THEN RETURN 4; WHEN OTHER THEN RETURN 99;
Lâexemple suivant montre comment retourner SQLCODE, SQLERRM (message dâerreur SQL), et SQLSTATE lors de la capture dâune exception :
DECLARE MY_EXCEPTION EXCEPTION (-20001, 'Sample message'); BEGIN RAISE MY_EXCEPTION; EXCEPTION WHEN STATEMENT_ERROR THEN RETURN OBJECT_CONSTRUCT('Error type', 'STATEMENT_ERROR', 'SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE); WHEN EXPRESSION_ERROR THEN RETURN OBJECT_CONSTRUCT('Error type', 'EXPRESSION_ERROR', 'SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE); WHEN OTHER THEN RETURN OBJECT_CONSTRUCT('Error type', 'Other error', 'SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE); END;Remarque : Si vous utilisez Snowflake CLI, SnowSQL, Classic Console, ou la méthode
execute_stream
ouexecute_string
dans le code Connecteur Python, utilisez cet exemple Ă la place (voir Utilisation de Snowflake Scripting dans Snowflake CLI, SnowSQL, le Classic Console et le connecteur Python) :EXECUTE IMMEDIATE $$ DECLARE MY_EXCEPTION EXCEPTION (-20001, 'Sample message'); BEGIN RAISE MY_EXCEPTION; EXCEPTION WHEN STATEMENT_ERROR THEN RETURN OBJECT_CONSTRUCT('Error type', 'STATEMENT_ERROR', 'SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE); WHEN EXPRESSION_ERROR THEN RETURN OBJECT_CONSTRUCT('Error type', 'EXPRESSION_ERROR', 'SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE); WHEN OTHER THEN RETURN OBJECT_CONSTRUCT('Error type', 'Other error', 'SQLCODE', SQLCODE, 'SQLERRM', SQLERRM, 'SQLSTATE', SQLSTATE); END; $$ ;
LâexĂ©cution de cet exemple produit le rĂ©sultat suivant :
+--------------------------------+ | anonymous block | |--------------------------------| | { | | "Error type": "Other error", | | "SQLCODE": -20001, | | "SQLERRM": "Sample message", | | "SQLSTATE": "P0001" | | } | +--------------------------------+
Cet exemple montre comment renvoyer une valeur Ă partir de chaque chemin possible :
declare e1 exception; e2 exception; begin statement_1; ... RETURN x; exception when e1 then begin ... RETURN y; end; when e2 then begin ... RETURN z; end; end;