Abaixo está um trecho da minha TRY/CATCH
lógica dentro de um procedimento armazenado com tratamento de erros (não incluí todas as DECLARE
instruções). Isso está sendo executado em um procedimento armazenado, no entanto, estou simplesmente testando isso em uma sessão via SSMS (isso afetaria o comportamento?). Eu tropecei neste tópico , mas eu tenho que ir tão longe para simplesmente capturar erros?
BEGIN TRY
DECLARE @sql varchar(1000);
SET @sql = 'select 1/0';
EXEC(@sql);
-- On Error the remaining TRY/CATCH below is compeltely ignored I discovered.
DECLARE @error int;
SET @error = @@error;
IF @error > 0
BEGIN
SET @raisemessage = 'SQL Backup Error: ' + cast(@rc as varchar(10));
RAISERROR (@raisemessage, 16,1);
END
END TRY
BEGIN CATCH
SET @errormessage = ERROR_MESSAGE();
IF @errormessage is null
SET @errormessage = ''
SET @errorstring = @errorstring + 'Database: ' + @name + ' Error: ' + @errormessage + char(10) + char(10);
END CATCH
Alguém pode explicar as deficiências deste bloco TRY/CATCH? Isso não funciona em T-SQL?
Na verdade, isso é muito mais simples do que eu pensava. Supondo que todas as variáveis usadas acima sejam declaradas em outro lugar, a resposta simples de por que o catch não está funcionando é que está funcionando, mas possui erros de sintaxe internos que resultam em um valor de retorno de NULL.
Considere esta linha:
A menos que você tenha declarado @errorstring assim:
Ou atribuída
@errorstring
como algum valor, a variável está atualmente definida como NULL. E, por padrão, concatenar qualquer coisa para NULL retorna... NULL.Mudando o código aqui para
Define a variável para o valor correto.