A linguagem SQL é bastante versátil e nos traz inúmeras possibilidades de execução, até mesmo quando estamos tratando de erros. Ao desenvolver uma query/procedure, podemos nos deparar com uma execução falha nas linhas de comando, que muitas vezes nem sabemos por onde começar a resolver. Essa tratativa de erro é especialmente útil em situações que a execução do script falha devido a um erro de sintaxe, restrição de integridade, falta de permissão ou outra falha.
A partir do SQL Server 2005, a linguagem T-SQL utiliza o TRY/CATCH: uma estrutura de controle de fluxo que funciona de maneira simples para gerenciar erros em seus scripts de banco de dados, nos beneficiando com um controle sobre nosso bloco de comando. A grosso modo, o TRY/CATCH é composto por duas partes principais:
TRY: parte do código onde o script é executado normalmente, qualquer erro que venha ocorrer durante a execução desse bloco de código, será captado pela estrutura TRY/CATCH.
CATCH: parte do código onde o erro é tratado, nessa parte fornecemos as instruções para lidar com o erro, como: mensagem de erro ou execução de ação alternativa.
Ou seja, o código principal é inserido no bloco TRY, caso o bloco TRY não encontre erros o bloco CATCH será ignorado, caso contrário, o bloco CATCH será acionado para sinalizar o erro. A sintaxe é descrita a seguir:
BEGIN TRY
{CODIGO_SQL}
END TRY
BEGIN CATCH
{CODIGO_SQL}
END CATCH
Para demonstrar sua utilização, vamos ao primeiro exemplo utilizando uma divisão simples: sabemos que na matemática, não podemos dividir um número por zero, pois a divisão por zero é igual ao infinito. Portanto, o código a ser executado é inserido no bloco BEGIN TRY/END TRY e sua tratativa de erro é inserida no bloco BEGIN CATCH/END CATCH:
Nesse caso, o SQL Server identificou a falha matemática que gerou um erro na seção e nos retornou a mensagem que estava dentro do bloco CATCH. Entretanto, quando executamos uma operação matemática válida, o código inserido no bloco TRY passa direto, sem sinalizar o bloco CATCH, como mostrado no exemplo a seguir.
Usualmente, é sempre bom utilizar o TRY/CATCH com transações, principalmente se estamos lidando com uma procedure com comandos de INSERT/UPDATE/DELETE. Quando utilizamos transações, garantimos que os dados estejam consistentes e caso um erro aconteça, o comando ROLLBACK pode ser acionado para todas as instruções que estão no TRY. Para exemplificar esse caso, foi criado uma tabela simples denominada ‘Pessoa’, onde o nome não pode ser nulo e há uma constraint garantindo que a idade seja maior que 18 anos.
Ao tentarmos adicionar um registro que conflita com nossa regra de negócio: nome nulo ou idade menor que 18 anos, podemos perceber no exemplo a seguir que é acionado o bloco CATCH, pois a inserção viola nossas definições implementadas na criação da tabela. O bloco CATCH por sua vez, nos identifica o erro e executa o ROLLBACK.
Novamente, quando executamos uma transação válida, o código inserido no bloco TRY passa direto, sem sinalizar o bloco CATCH, como mostrado no exemplo a seguir.
O objetivo da utilização do tratamento de erros é verificar qual é o erro, para tomarmos a devida providência e corrigi-lo. O SQL Server possui algumas funções para nos ajudar na investigação do erro com mais assertividade através de informações mais detalhadas. Temos várias funções do sistema que devem ser usadas no bloco CATCH, a tabela abaixo descreve as funções do sistema para esse fim:
Ao tentarmos adicionarmos novamente um registro que conflita com nossa regra de negócio, podemos perceber que é acionado o bloco CATCH pelo fato da inserção violar nossas definições implementadas na criação da tabela, porém, dessa vez temos informações mais detalhadas para ajustarmos o problema.
Há outras formas mais simples de executar esse tratamento detalhado de erros, como: adicionando todo o código em uma procedure para ser chamada no bloco CATCH ou até mesmo utilizando a função THROW/RAISERROR para determinar a mensagem, severidade e o número do erro. Independentemente da forma utilizada para executar o tratamento de erros, podemos perceber quão poderosa pode ser essa ferramenta para nos auxiliar nas tarefas do dia a dia. É considerado uma boa prática que toda procedure possua esse tipo de tratamento para não perder nenhuma informação caso haja uma falha e assim, aumentar a agilidade e assertividade.
REFERÊNCIA