У меня есть хранимая процедура, которая выполняет некоторую проверку параметров и должна завершиться с ошибкой и прекратить выполнение, если параметр недействителен.
Мой первый подход к проверке ошибок выглядел так:
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 не останавливает выполнение, а "проверка правильности" печатается вместе с сообщениями об ошибках.
Я знаю, что могу просто добавить возврат после каждого raiserror, но это выглядит как-то уродливо для меня:
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. Проблема заключалась в том, что ошибка была проглочена и вообще не отправлена клиенту. Поэтому я провел некоторое исследование и нашел способ rethrow ошибку:
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
Я все еще не доволен этим подходом, поэтому я спрашиваю вас:
Как выглядит ваша проверка параметров? Есть ли какая-то "лучшая практика" для такого рода проверки?