„Właściwy” sposób sprawdzania poprawności parametrów procedury przechowywanej
Mam procedurę składowaną, która sprawdza niektóre parametry i powinna zakończyć się niepowodzeniem i zatrzymać wykonanie, jeśli parametr jest niepoprawny.
Moje pierwsze podejście do sprawdzania błędów wyglądało tak:
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
To nie przyniosło rezultatu, ponieważ stopień ważności 18 nie zatrzymuje wykonania, a „sprawdzanie poprawności” zostało wydrukowane razem z komunikatami o błędach.
Wiem, że mogę po prostu dodać zwrot po każdym raiserror, ale wygląda to trochę brzydko dla mnie:
if (@fooInt = 0 and (@fooString is null or @fooString = ''))
begin
raiserror('invalid parameter: foo', 18, 0)
return
end
...
print 'validation succeeded'
-- do some work
Ponieważ błędy o sile 11 i wyższej są wychwytywane w bloku try / catch, innym podejściem, które testowałem, było hermetyzowanie sprawdzania błędów wewnątrz takiego bloku try / catch. Problem polegał na tym, że błąd został połknięty i nie został w ogóle wysłany do klienta. Zrobiłem więc trochę badań i znalazłem sposób na topowtórzyć błąd:
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
Nadal nie jestem zadowolony z tego podejścia, dlatego proszę Cię:
Jak wygląda walidacja parametrów? Czy istnieje jakaś „najlepsza praktyka” do tego rodzaju kontroli?