A instrução TRY / CATCH em Transact-SQL detecta e trata as condições de erro em aplicativos de banco de dados. Esta declaração é a pedra angular de SQL O tratamento de erros do servidor é uma parte importante do desenvolvimento de aplicativos de banco de dados robustos.
TRY / CATCH se aplica ao SQL Server a partir de 2008, Banco de Dados SQL do Azure, Azure SQL Data Warehouse e Parallel Data Warehouse.
Apresentando TRY / CATCH
TRY./CATCH funciona especificando duas instruções Transact-SQL: uma que você deseja "tentar" e outra para "capturar" quaisquer erros que possam surgir. Quando o SQL Server encontra uma instrução TRY / CATCH, ele executa imediatamente a instrução incluída na cláusula TRY. Se a instrução TRY for executada com êxito, o SQL Server continuará. No entanto, se a instrução TRY gerar um erro, o SQL Server executará a instrução CATCH para tratar o erro normalmente.
A sintaxe básica assume este formato:
COMECE A TENTAR
{sql_statement | bloco de declaração}
END TRY
COMEÇAR A CAPTURA
[{sql_statement | declaração_block}]
END CATCH
[; ]
Exemplo de TRY / CATCH
Considere um banco de dados de recursos humanos que contém uma tabela chamada funcionários, que contém informações sobre cada um dos funcionários de uma empresa. Essa tabela usa um número inteiro de ID de funcionário como o chave primária.
Você pode tentar usar a instrução abaixo para inserir um novo funcionário em seu banco de dados:
INSERT INTO funcionários (id, first_name, last_name, extension)
VALUES (12497, 'Mike', 'Chapple', 4201)
Em circunstâncias normais, essa instrução adicionaria uma linha à tabela Funcionários. No entanto, se um funcionário com ID 12497 já existir no banco de dados, inserir a linha violaria a restrição de chave primária e resultaria no seguinte erro:
Msg 2627, Nível 14, Estado 1, Linha 1
Violação da restrição PRIMARY KEY 'PK_employee_id'. Não é possível inserir uma chave duplicada no objeto 'dbo.employees'.
A instrução foi encerrada.
Embora esse erro forneça as informações de que você precisa para solucionar o problema, há dois problemas nele. Primeiro, a mensagem é enigmática. Inclui códigos de erro, números de linha e outras informações incompreensíveis para o usuário comum. Em segundo lugar, e mais importante, faz com que a instrução seja abortada e pode causar um travamento do aplicativo.
A alternativa é envolver a instrução em uma instrução TRY... CATCH, conforme mostrado aqui:
COMECE A TENTAR
INSERT INTO funcionários (id, first_name, last_name, extension)
VALUES (12497, 'Mike', 'Chapple', 4201)
END TRY
COMEÇAR A CAPTURA
IMPRIMIR 'ERRO:' + ERROR_MESSAGE ();
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Correio do funcionário',
@recipients = '[email protected]',
@body = 'Ocorreu um erro ao criar um novo registro de funcionário.',
@subject = 'Erro de banco de dados de funcionários';
END CATCH
Neste exemplo, quaisquer erros que ocorram são relatados ao usuário que executa o comando e ao endereço de e-mail [email protected]. O erro mostrado ao usuário é:
Erro: violação da restrição PRIMARY KEY 'PK_employee_id'.
Não é possível inserir uma chave duplicada no objeto 'dbo.employees'.
Correio na fila.
A execução do aplicativo continua normalmente, permitindo que o programador trate o erro. O uso da instrução TRY / CATCH é uma maneira elegante de detectar e tratar proativamente os erros que ocorrem nos aplicativos de banco de dados do SQL Server.
Aprendendo mais
Para saber mais sobre a Structured Query Language, confira nosso artigo Fundamentos de SQL.