У меня есть хранимая процедура, которая выполняет проверку некоторых параметров и должна завершиться сбоем и остановить выполнение, если параметр недопустим.
Мой первый подход к проверке ошибок выглядел так:
create proc spBaz
(
@fooInt int = 0,
@fooString varchar(10) = null,
@barInt int = 0,
@barString varchar(10) = null
)
as
begin
if (@fooInt = 0 and (@fooString is null or @fooString = ''))
raiserror('invalid parameter: foo', 18, 0)
if (@barInt = 0 and (@barString is null or @barString = ''))
raiserror('invalid parameter: bar', 18, 0)
print 'validation succeeded'
-- do some work
end
Это не сработало, поскольку уровень серьезности 18 не останавливает выполнение, и вместе с сообщениями об ошибках выводится «проверка прошла успешно».
Я знаю, что могу просто добавить возврат после каждого рейзеррора, но мне это кажется некрасивым:
if (@fooInt = 0 and (@fooString is null or @fooString = ''))
begin
raiserror('invalid parameter: foo', 18, 0)
return
end
...
print 'validation succeeded'
-- do some work
Поскольку ошибки со степенью серьезности 11 и выше обнаруживаются в блоке try / catch, другой проверенный мною подход заключался в инкапсуляции проверки ошибок внутри такого блока try / catch. Проблема заключалась в том, что ошибка была проглочена и не отправлена клиенту вообще. Поэтому я провел небольшое исследование и нашел способ отбросить ошибку:
begin try
if (@fooInt = 0 and (@fooString is null or @fooString = ''))
raiserror('invalid parameter: foo', 18, 0)
...
end try
begin catch
exec usp_RethrowError
return
end catch
print 'validation succeeded'
-- do some work
Я все еще не доволен этим подходом, поэтому я прошу вас:
Как выглядит проверка вашего параметра? Есть ли какая-то «лучшая практика» для такого рода проверки?