„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:

<code>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
</code>

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:

<code>  if (@fooInt = 0 and (@fooString is null or @fooString = ''))
  begin
    raiserror('invalid parameter: foo', 18, 0)
    return
  end

  ...

  print 'validation succeeded'
  -- do some work
</code>

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:

<code>  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
</code>

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?

questionAnswers(5)

yourAnswerToTheQuestion