Заметки Дмитрия Пилюгина о Microsoft SQL Server 

Twitter RSS
Home SQL Server (все заметки) Некоторые случаи необрабатываемые блоком try/catch
formats

Некоторые случаи необрабатываемые блоком try/catch

Возможно, не все знают, что в 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.
В ней хорошо рассказывается про подобные подводные камни при обработке ошибок, а также разбираются многие другие интересные темы.

 
Теги:, ,

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Анти-спам: введите результат (цифрами) *