Tratamento de exceções¶
Em um bloco do Script Snowflake, você pode gerar uma exceção se ocorrer um erro. Você também pode tratar exceções que ocorrem em seu código do Script Snowflake.
Introdução ao tratamento de exceções no Script Snowflake¶
O Script Snowflake gera uma exceção se um erro ocorrer durante a execução de uma instrução. Por exemplo, se uma instrução tentar remover uma tabela que não existe, o Script Snowflake gera uma exceção.
Em um bloco do Script Snowflake, você pode escrever manipuladores de exceções que capturem tipos específicos de exceções declaradas nesse bloco e em blocos aninhados dentro dele. Além disso, para erros que podem ocorrer em seu código, você pode definir suas próprias exceções que você pode gerar quando erros ocorrerem.
Depois que as instruções no manipulador forem executadas, você poderá optar por sair do bloco ou continuar executando as instruções no bloco. Para obter mais informações, consulte Tratamento de exceções no Script Snowflake.
Quando uma exceção é gerada em um bloco do Script Snowflake, seja por seu código ou por uma instrução cuja execução falhar, o Script Snowflake tenta encontrar um manipulador para essa exceção:
Se o bloco no qual a exceção ocorreu tiver um manipulador para essa exceção, a execução será retomada no início desse manipulador de exceções.
Se o bloco não tiver seu próprio manipulador de exceções, a exceção poderá ser capturada pelo bloco superior.
Se a exceção ocorrer a mais de uma camada de profundidade, a exceção será enviada para cima, uma camada de cada vez, até que:
Uma camada com um manipulador de exceções adequado trate a exceção.
A camada mais externa seja atingida; nesse caso, ocorrerá um erro.
Se não houver um manipulador para a exceção no bloco atual ou em qualquer bloco adjacente, a execução do bloco será interrompida e o cliente que enviar o bloco para execução (por exemplo, Snowsight, SnowSQL e assim por diante) relatará isso como um erro do Snowflake.
Um manipulador de exceções pode conter seu próprio manipulador de exceções, caso uma exceção ocorra enquanto ele trata outra exceção.
Como declarar uma exceção no Script Snowflake¶
Você pode declarar sua própria exceção na seção DECLARE do bloco. Use a sintaxe descrita em Sintaxe da instrução de exceção. Por exemplo:
Como gerar uma exceção declarada no Script Snowflake¶
Para gerar uma exceção, execute o comando RAISE. Por exemplo:
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):
Se não houver um manipulador, a execução será interrompida no ponto em que a exceção for gerada. No exemplo, counter nunca é incrementado e retornado.
O cliente que envia esse bloco para execução, por exemplo, Snowsight, relata um erro e indica que a exceção não foi capturada:
Se você quiser adicionar código para tratar quaisquer exceções que você gerar (assim como exceções geradas quando as instruções não forem executadas), você pode escrever manipuladores de exceções. Consulte Tratamento de exceções no Script Snowflake.
Nota
Em um manipulador de exceções, se você precisar levantar a mesma exceção novamente, veja Gerar novamente a mesma exceção em um manipulador de exceções no Script Snowflake.
Tratamento de exceções no Script Snowflake¶
Você pode tratar uma exceção explicitamente capturando-a com uma cláusula EXCEPTION, ou você pode permitir que o bloco passe a exceção para o bloco superior.
Dentro da cláusula EXCEPTION, use uma cláusula WHEN para tratar uma exceção pelo nome. Você pode tratar tanto as exceções que você declara quanto as exceções internas. Atualmente, o Snowflake oferece as seguintes exceções internas:
STATEMENT_ERROR: Essa exceção indica um erro durante a execução de uma instrução. Por exemplo, se você tentar remover uma tabela que não existe, essa exceção é gerada.
EXPRESSION_ERROR: Essa exceção indica um erro relacionado a uma expressão. Por exemplo, se você criar uma expressão que é avaliada como um VARCHAR e tentar atribuir o valor da expressão a um FLOAT, esse erro será gerado.
Cada cláusula WHEN em um bloco de exceção pode ser de um dos seguintes tipos:
EXIT: o 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 a instrução que causou o erro, essas instruções não serão executadas.
Se o bloco for um bloco interno e o manipulador de exceção não contiver uma instrução 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 bloco de exceção e continua com a instrução imediatamente após a que causou o erro.
Um manipulador CONTINUE pode capturar e manipular exceções sem encerrar o bloco de instruções que gerou a exceção. Com o manipulador padrão EXIT, quando ocorre um erro em um bloco, o fluxo é interrompido e o erro é retornado ao autor da chamada. No entanto, você pode usar um manipulador CONTINUE quando a condição de erro não é grave o suficiente para justificar a interrupção do fluxo.
Uma cláusula EXCEPTION pode ter cláusulas WHEN de ambos os tipos: EXIT e CONTINUE.
Quando ocorre uma exceção, você pode obter informações sobre a exceção lendo as três variáveis internas a seguir:
SQLCODE: Esse é um integer assinado de 5 dígitos. Para exceções definidas pelo usuário, essa é a
exception_numbermostrada na sintaxe para declarar uma exceção.SQLERRM: Essa é uma mensagem de erro. Para exceções definidas pelo usuário, essa é a
exception_messagemostrada na sintaxe para declarar uma exceção.SQLSTATE: Este é um código de 5 caracteres modelado no padrão ANSI SQL SQLSTATE. O Snowflake usa valores adicionais além daqueles do padrão ANSI SQL.
Quando você usa uma cláusula WHEN do tipo CONTINUE, essas variáveis internas refletem o erro que causou a exceção na cláusula WHEN. Depois que as instruções na cláusula WHEN forem concluídas e a execução da instrução continuar no bloco, os valores dessas variáveis retornarão os valores que tinham antes da exceção ter sido gerada.
Para tratar todas as outras exceções que não estão integradas ou declaradas, use uma cláusula WHEN OTHER THEN. A cláusula WHEN OTHER THEN pode ser do tipo EXIT ou CONTINUE.
Por exemplo, suponha que você tenha a seguinte tabela de log de erros para rastrear suas exceções:
O bloco anônimo a seguir insere informações sobre as exceções na tabela e retorna informações sobre elas para o usuário:
Dica
O exemplo define uma exceção na seção DECLARE e, em seguida, trata essa exceção. Para um exemplo que lida com uma exceção STATEMENT_ERROR, remova os comentários (--) dessa linha:
Para um exemplo que lida com outros erros, remova os comentários dessa linha:
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):
Para o valor retornado, este exemplo trata cada tipo de exceção chamando OBJECT_CONSTRUCT para construir e retornar um objeto que contém os detalhes sobre a exceção. O exemplo produz a seguinte saída:
Você pode consultar o test_error_log tabela para confirmar que o erro foi registrado:
O exemplo anterior usou cláusulas WHEN do tipo padrão (EXIT). Se uma das cláusulas WHEN capturar uma exceção, ela executará as instruções na cláusula WHEN e depois sairá. Portanto, o código a seguir não é executado:
Se você quiser tratar uma exceção e depois continuar executando o código no bloco, especifique cláusulas WHEN do tipo CONTINUE. O exemplo a seguir é o mesmo que o exemplo anterior, mas especifica cláusulas WHEN do tipo CONTINUE e remove a instrução RETURN de cada cláusula WHEN:
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 exemplo continuava executando o seguinte código depois que a exceção foi gerada:
Para mais informações sobre manipuladores CONTINUE, consulte EXCEPTION (Script Snowflake).
Em casos raros, você pode querer lidar explicitamente com uma exceção, não fazendo nada. Isto permite que você continue, em vez de encerrar, quando a exceção ocorre. Para obter mais informações, consulte o comando NULL.
Nota
Se você precisar gerar a mesma exceção novamente, veja Gerar novamente a mesma exceção em um manipulador de exceções no Script Snowflake.
Se você não configurar um manipulador para uma exceção, o cliente que envia o bloco para execução (por exemplo, a Snowsight) relatará um erro como explicado em Como gerar uma exceção declarada no Script Snowflake.
Gerar novamente a mesma exceção em um manipulador de exceções no Script Snowflake¶
Em alguns casos, você pode precisar gerar a mesma exceção que você capturou em seu manipulador de exceções. Nesses casos, execute o comando RAISE sem especificar nenhum argumento.
Por exemplo, suponha que durante o tratamento de exceções, você precise capturar alguns detalhes sobre a exceção antes de gerar a mesma exceção novamente. Depois de capturar os detalhes, execute o comando RAISE:
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):
Como passar variáveis para um manipulador de exceção no Snowflake Scripting¶
É possível passar variáveis para um manipulador de exceção. O manipulador de exceção pode executar código com base no valor da variável, e o valor da variável pode ser retornado em mensagens de erro.
Para que uma variável seja passada para um manipulador na seção EXCEPTION, a variável deve ser declarada na seção DECLARE. Se uma variável for declarada na seção BEGIN … END do bloco, ela não poderá ser acessada na seção EXCEPTION.
Além disso, se você estiver escrevendo um procedimento armazenado do Snowflake Scripting que aceita argumentos, é possível usar esses argumentos em um manipulador de exceção.
Por exemplo, o seguinte bloco anônimo passa o valor da variável counter_val para o 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):
O bloco retorna a seguinte mensagem de erro:
A seguir está um exemplo de um procedimento armazenado do Snowflake Scripting que passa um argumento. O exemplo demonstra como você pode usar o argumento em um 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):
As seguintes chamadas para o procedimento armazenado mostram a saída esperada: