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? 🙂