Возможно, не все знают, что в t-sql конструкция try catch обрабатывает не все ошибки.
Это поведение хорошо документировано, но может стать сюрпризом для людей привыкших работать с классическим try/catch в объектно-ориентированных языках.
Подробно это описано в документации TRY…CATCH (Transact-SQL), Использование конструкции TRY…CATCH в языке Transact-SQL — я же просто приведу некоторые примеры, на которые наталкивался сам.
create function dbo.uf_NotExistsingFunc() returns char(1) as begin return 'Y' end go --просто убедимся что блок catch написан верно и ловит ошибки begin try select 1/0 end try begin catch print('поехали!') end catch go --не ловит (опечатались в названии функции) begin try select dbo.uf_otExistsingFunc() end try begin catch print('опечатались в названии функции - catched!') end catch go --не ловит (не существующая временная таблица) begin try select * from #NotExistsingTable end try begin catch print('не существующая временная таблица - catched!') end catch go --не ловит (не существующая таблица) begin try select * from dbo.NotExistsingTable end try begin catch print('не существующая таблица - catched!') end catch go --ловит (не существующая процедура) begin try exec dbo.NotExistsingProc end try begin catch print('не существующая процедура - catched!') end catch go --ловит (ошибка в динамике/вызываемой процедуре) begin try exec ('select * from NotExistsingTable') end try begin catch print('ошибка в динамике/вызываемой процедуре - catched!') end catch go drop function dbo.uf_NotExistsingFunc go
результат
(0 row(s) affected) поехали! Msg 195, Level 15, State 10, Line 3 'uf_otExistsingFunc' is not a recognized built-in function name. Msg 208, Level 16, State 0, Line 3 Invalid object name '#NotExistsingTable'. Msg 208, Level 16, State 1, Line 3 Invalid object name 'dbo.NotExistsingTable'. не существующая процедура - catched! ошибка в динамике/вызываемой процедуре - catched!
Это некоторые частные случаи, которые встречались мне.
Классификация всех таких случаев и более подробное описание есть в документации. Надеюсь, что эта небольшая заметка cподвигнет людей не сталкивавшихся с этим заглянуть в BOL, чтобы ознакомиться подробнее и иметь это ввиду при написании кода на t-sql.
Также рекомендую ознакомиться с книгой Defensive Database Programming By Alex Kuznetsov, которая доступна в виде бесплатного PDF на сайте redgate.
В ней хорошо рассказывается про подобные подводные камни при обработке ошибок, а также разбираются многие другие интересные темы.