A maneira "certa" de fazer a validação de parâmetros de procedimento armazenado

Eu tenho um procedimento armazenado que faz alguma validação de parâmetro e deve falhar e parar a execução se o parâmetro não é válido.

Minha primeira abordagem para verificação de erros se pareceu com isto:

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

Isso não funcionou, pois a gravidade 18 não interrompe a execução e a 'validação bem-sucedida' é impressa junto com as mensagens de erro.

Eu sei que eu poderia simplesmente adicionar um retorno após cada raiserror, mas isso parece meio feio para mim:

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

Como os erros com gravidade 11 e superior são capturados em um bloco try / catch, outra abordagem que testei foi encapsular minha verificação de erros dentro desse bloco try / catch. O problema é que o erro foi engolido e não foi enviado ao cliente. Então eu fiz algumas pesquisas e encontrei uma maneira deretroceder o erro:

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

Eu ainda não estou feliz com essa abordagem, então estou perguntando a você:

Como é a validação do seu parâmetro? Existe algum tipo de "melhor prática" para fazer este tipo de verificação?

questionAnswers(5)

yourAnswerToTheQuestion