terça-feira, 7 de setembro de 2010

Tratamento de erros no SQL Server (TRY-CATCH)

Em linguagens de progamação como C# e Java, é comum o uso do bloco TRY-CATCH para tratar as exceções lançadas durante a execução das aplicações.

Ao implementar Stored Procedures, Funções e Triggers, ou mesmo batches mais complexos, pode ser necessário tratar os possíveis erros ocorridos nos comandos.

Até a versão 2000 do SQL Server, era necessário utilizar a função de sistema @@ERROR após cada um dos comando executado, pois o valor de retorno dessa função é reiniciao a cada comando executado.

As versões 2005 e 2008 do SQL Server permitem implementar o tratamento de erros através do bloco TRY-CATCH, de maneira semelhante às linguagens de programação convecionais. 

Este bloco é formado por dois sub-blocos:

TRY - contém os comandos necessários para executar a tarefa desejada
CATCH - contém os comandos para tratamento de possíveis erros ocorridos no bloco TRY

Quando um erro ocorre no dentro do bloco TRY a execução é desviada para o bloco CATCH, o que permite continuar a execução do script ou interrompê-lo, de acordo com as necessidades do usuário e gravidade do erro gerado.
Sintaxe
A sintaxe definida para este bloco de comandos é a seguinte

BEGIN TRY
     [comandos SQL para execução de uma tarefa]
END TRY
BEGIN CATCH
     [comandos SQL para tratamento do erro]
END CATCH

Exemplo
Abaixo, temos um tratamento de erro realizado através deste bloco de comandos:

-- Criando tabela para teste
CREATE TABLE #teste (id int)

-- Adicionando restrição à tabela.
-- Somente IDs menores do que 10 serão aceitos

ALTER TABLE #teste ADD CONSTRAINT chkID CHECK (id < 10)

-- Executando a tarefa em transação
BEGIN TRANSACTION

BEGIN TRY
       
    INSERT INTO #teste VALUES (5)
    INSERT INTO #teste VALUES (2)
    INSERT INTO #teste VALUES (13)  -- Inserção de ID inválido

    COMMIT TRANSACTION -- Efetivando alterações na base

END TRY
BEGIN CATCH
   
    PRINT 'Erro ao executar script'
    ROLLBACK TRANSACTION -- Desfazendo as alterações na base
         
END CATCH

SELECT * FROM #teste

DROP TABLE #teste

Ao executar o script, obtemos o resultado abaixo. Verifique que nenhuma linha foi inserida na tabela #teste.

As mensagens exibidas no console do SQL estão abaixo:


Observe que nenhuma mensagem de erro do sistema foi lançada. Apenas a mensagem do tratamento foi exibida.
Informações sobre o erro
O SQL Server permite recuperar as informações do erro lançado no bloco TRY, através de algumas funções do sistema:

ERROR_NUMBER() -Retorna o número do erro ERROR_MESSAGE() - Exibe a mensagem do erro ERROR_SEVERITY() - Retorna o grau de severidade do erro ERROR_LINE()  - Retorna a linha em que o erro ocorreu

Referências
http://msdn.microsoft.com/pt-br/library/ms175976.aspx

2 comentários:

Anônimo disse...

Olá, se possível, poste o mesmo exemplo para SQL 2000.

Desde já, obrigado!

Evandro disse...

Olá!

Infelizmente, o SQL Server 2000 não disponibiliza comandos de tratamento de erro no formato TRY-CATCH.

O que se pode fazer é utilizar a variável @@ERROR para verificar se houve erro após a execução de um comando. Se houve erro, @@ERROR > 0.

Mas tome cuidado, essa variável tem seu valor alterado após cada comando executado. Ou seja, se 2 comandos são executados e apenas o primeiro causar erro, a variável terá valor 0 (sucesso da execução). Assim, deve-se verificar o valor após cada comando executado no banco de dados.

Para mais informações, consulte o site do MSDN - http://msdn.microsoft.com/en-us/library/aa933181(v=sql.80).aspx

Postar um comentário