EXCEPTION (Script Snowflake)¶
Especifica como lidar com exceções geradas no bloco do Script Snowflake.
Para obter mais informações sobre exceções, consulte Tratamento de exceções.
- Consulte também:
Sintaxe¶
Onde:
exception_nameUm nome de exceção definido na parte DECLARE do bloco atual ou em um bloco delimitador.
statementUma instrução pode ser qualquer uma das seguintes opções:
Uma única instrução SQL (incluindo CALL).
Uma instrução de fluxo de controle (por exemplo, uma instrução de loop ou ramificação).
Um bloco aninhado.
Notas de uso¶
Cada bloco pode ter seu próprio manipulador de exceção.
O Snowflake não oferece suporte a mais do que um manipulador de exceção por bloco. Entretanto, esse manipulador pode pegar mais de um tipo de exceção por ter mais de uma cláusula
WHEN.A cláusula
WHEN OTHER [ { EXIT | CONTINUE } ] THENcaptura qualquer exceção ainda não especificada.Um manipulador de exceção se aplica a instruções entre BEGIN e EXCEPTION Seções do bloco no qual é declarado. Ele não se aplica ao DECLARE Seção do bloco.
Um manipulador de exceção só pode lidar com uma exceção especificada se essa exceção especificada estiver no escopo.
Se um procedimento armazenado se destina a retornar um valor, ele deve retornar um valor de cada caminho de saída possível, incluindo cada cláusula
WHENdo tipoEXITno manipulador de exceções.Para usar uma variável em um manipulador de exceção, a variável deve ser declarada na seção DECLARE ou passada como um argumento para um procedimento armazenado. Não pode ser declarada na seção BEGIN … END. Para obter mais informações, consulte Como passar variáveis para um manipulador de exceção no Snowflake Scripting.
Quando ocorre uma exceção, as condições do manipulador são verificadas em ordem e o primeiro
WHENA cláusula que corresponde é usada. A ordem dentro de um bloco é de cima para baixo, e os blocos internos são verificados antes dos blocos externos. Não há preferência na correspondênciaEXITouCONTINUEmanipuladores, o que corresponder primeiro será usado.Apenas um manipulador pode ser correspondido para uma instrução. No entanto, qualquer exceção encontrada dentro de um corpo do manipulador de exceções pode acionar manipuladores de exceções de bloco externo.
Cada
WHENA cláusula em um manipulador de exceção pode ser de um dos seguintes tipos:EXITo bloco executa as instruções no manipulador e depois sai do bloco atual. Se o bloco executar uma exceção desse tipo e o bloco contiver instruções após o manipulador de exceção, essas instruções não serão executadas.Se o bloco for um bloco interno e o manipulador de exceção não contiver um
RETURN, a execução sairá do bloco interno e continuará com o código no bloco externo.EXITé o padrão.CONTINUE- O bloco executa as instruções no manipulador e continua com a instrução imediatamente após a que causou o erro.
Uma cláusula
EXCEPTIONpode ter cláusulasWHENde ambos os tipos:EXITeCONTINUE.Para uma cláusula
WHENdo tipoCONTINUE, as seguintes notas de uso são aplicadas:Se um erro for levantado em um construção de ramificação, a instrução contínua será a instrução imediatamente após a construção da ramificação.
Se um erro for gerado na condição de um Loop, a instrução contínua é a instrução imediatamente após o loop.
Se um erro for levantado no corpo de um loop, então a instrução contínua é a instrução na próxima iteração do loop. Para obter um exemplo, consulte Tratamento de uma exceção e continuação.
Se um erro for levantado em uma instrução RETURN, então a instrução que continua é a instrução imediatamente após a instrução
RETURN.Se um erro for levantado em um procedimento armazenado aninhado e o erro é tratado pelo escopo externo, então a instrução contínua é a instrução imediatamente após a chamada do procedimento armazenado.
Evite incluir uma instrução
RETURNem uma cláusulaWHENdo tipoCONTINUE. Se você incluir uma instruçãoRETURN, então o procedimento armazenado retorna sem continuar.
Para uma cláusula
WHENdo tipoCONTINUE, os exemplos a seguir mostram qual instrução é a instrução imediatamente após a que causou o erro para diferentes cenários. Nesses exemplos, oerror_expressioné a expressão que gerou a exceção, e ocontinue_statementé a instrução com a qual o código continua no bloco após as instruções do manipuladorCONTINUE.
Exemplos¶
Os exemplos a seguir declaram e geram exceções e tratam as exceções com manipuladores de exceção:
Tratamento de exceções de mais de um tipo¶
O exemplo a seguir mostra um manipulador de exceções projetado para lidar com mais de um tipo de exceção:
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
A saída mostra que o manipulador de exceção pegou a exceção.
Tratamento de uma exceção e continuação¶
O exemplo a seguir mostra um manipulador de exceção com uma cláusula WHEN do tipo CONTINUE:
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
A saída mostra que o manipulador de exceção pegou a exceção, executou uma instrução que adicionou 1 ao contador, e então executava a instrução seguinte depois que a exceção foi capturada, o que adicionou 10 para o contador:
O exemplo a seguir mostra como um manipulador de exceção com uma cláusula WHEN do tipo CONTINUE funciona quando um erro é gerado em um loop. O exemplo gera um erro na primeira iteração porque tenta dividir o valor 10 por zero. O CONTINUE o manipulador registra o erro na error_log_table, e o bloco continua com a próxima iteração do loop, que divide 10 por 1. O loop continua a iterar até 10 é dividido por 5 e o loop termina. A saída é 2:
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
Tratar exceções em blocos aninhados¶
Este exemplo a seguir demonstra blocos aninhados e mostra que um bloco interno pode gerar uma exceção declarada tanto no bloco interno quanto no externo:
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
A saída mostra que o manipulador de exceção pegou a exceção.
Este exemplo seguinte é semelhante ao exemplo anterior, mas demonstra blocos aninhados, cada um dos quais com seu próprio manipulador de exceção:
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
Nota
Este exemplo usa o mesmo nome de exceção (e1) nos blocos externo e interno, o que não é recomendado.
O exemplo faz isso para ilustrar o escopo dos nomes de exceção. As duas exceções com o nome e1 são exceções diferentes.
O manipulador e1 no bloco externo não lida com a exceção e1 que é declarada e gerada no bloco interno.
A saída mostra que o manipulador de exceção interno funcionou:
Tratamento de exceções múltiplas na mesma cláusula e exceções não especificadas¶
O fragmento de exemplo a seguir mostra como executar duas tarefas:
Capture mais de uma exceção na mesma cláusula usando
OR.Capture exceções não especificadas usando
WHEN OTHER THEN.
Tratamento de exceções usando variáveis internas¶
O exemplo a seguir mostra como retornar SQLCODE, SQLERRM (SQL mensagem de erro) e SQLSTATE valores de variáveis internas ao capturar uma exceção:
Note: If you use Snowflake CLI, SnowSQL, the Classic Console, or the
execute_stream or execute_string method in Python Connector
code, use this example instead (see Using Snowflake Scripting in Snowflake CLI, SnowSQL, and Python Connector):
A execução deste exemplo produz os seguintes resultados: