Quando um erro dentro de um TRY não corre o código dentro do CATCH

Conversa interessante com um colega de profissão, estamos a discutir um caso em que anda um bug à solta e de repente digo-lhe:

“Mas nem sempre um TRY/CATCH funciona como estás à espera, por vezes há erro dentro do código no TRY e não salta para o CATCH”.

Sim, há quem não acredite. Mas acontece. E até está bem documentado.

Vamos ver um desses casos para dissiparmos dúvidas?

Criamos uma tabela e umas SPs que a vão usar.

create table TryCatchDemo
(	id int
,	Col1 int
)
go

create procedure TryCatchDemo01
as
begin try
	print 'Está no Try'
	select top 10 * from demo01.dbo.TryCatchDemo
end try
begin catch
	print 'Está no Catch'
end catch
go

exec TryCatchDemo01

Entramos no TRY e não entramos no CATCH, claro.

Mas se criarmos uma SP que vai “bater”?

create procedure TryCatchDemo02
as
begin try
	print 'Está no Try'
	select top 10 * from demo01.dbo.TryCatchDemooooooooooooooooo
end try
begin catch
	print 'Está no Catch'
end catch
go

exec TryCatchDemo02

Entrámos no TRY, depois ocorreu um erro dentro do bloco e… nada de entrar no CATCH.

E se for com código dinâmico?

create procedure TryCatchDemo03
as
begin try
	print 'Está no Try'
	exec (N'select top 10 * from demo01.dbo.TryCatchDemooooooooooooooooo')
end try
begin catch
	print 'Está no Catch'
end catch
go

exec TryCatchDemo03

Agora entramos no CATCH.

E se recebermos o nome da tabela como parâmetro para o código dinâmico?

create procedure TryCatchDemo04
	@table nvarchar(255)
as
begin try
	print 'Está no Try'
	exec (N'select top 10 * from ' + @table)
end try
begin catch
	print 'Está no Catch'
end catch
go

exec TryCatchDemo04 'demo01.dbo.TryCatchDemo'
exec TryCatchDemo04 'demo01.dbo.TryCatchDemooooooooooooooooo'

No primeiro caso tudo corre bem, a tabela existe. No segundo há erro e entramos pelo bloco do CATCH.

Ou seja, quando temos um erro de compilação dentro de um bloco TRY não entramos no CATCH.

Mas são situações que nunca acontecem, pois não? 🙂

Share

You may also like...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *