我有一个存储过程,执行一些参数验证,如果参数无效,应该失败并停止执行。 # ~) }7 C. E. B$ w我的第一种错误检查方法如下:3 e- X- i' \2 p' Y0 R' g
create proc spBaz( @fooInt int = 0, @fooString varchar(10) = null, @barInt int = 0, @barString varchar(10) = null)asbegin 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 workend这并没有解决问题,因为严重性18不会停止执行,验证成功会与错误信息一起打印。* h) z- P0 P8 b
我知道我可以在每个加薪者之后简单地添加回报,但这对我来说似乎很丑: 6 V( d2 D, O/ |( B/ z$ l* D if (@fooInt = 0 and (@fooString is null or @fooString = ) begin raiserror('invalid parameter: foo return end ... print 'validation succeeded' -- do some work因严重性为11或更高的错误而被捕获try / catch因此,我测试的另一种方法是在块中包装错误检查try / 3 p% E$ z; B; \ w( [catch块中。问题是该错误被吞没了,根本没有发送给客户端。因此,我进行了一些研究,找到了一种重新抛出错误的方法:5 C$ ?! P' s, P! m1 f7 i. r
begin try if (@fooInt = 0 and (@fooString is null or @fooString = )raiserror('invalid parameter: foo ... end try begin catch exec usp_RethrowError return end catch print 'validation succeeded' -- do some work我仍然对这种方法不满意,所以我问你: 4 H/ m+ D5 y+ p5 N K您的参数验证效果如何?这种检查是否有最佳实践?% I( X$ o5 G6 S J
: c0 k9 u V7 Q8 C! l 解决方案: ' }8 w" A& t% x# Z0 w( r( }6 i 我认为没有唯一的正确方法可以做到这一点。. D* a6 G$ I' \6 n
我自己的偏好类似于你的第二个例子,但每个参数都有一个单独的验证步骤和更清晰的错误信息。 " @6 P" d2 D& ~2 V1 p [ u$ y5 t正如你所说,这有点麻烦和丑陋,但代码的意图对任何阅读它的人来说都是显而易见的,并且可以完成工作。, l6 h7 T' d+ L Y) L! r \
IF (ISNULL(@fooInt,0) = 0)BEGIN RAISERROR('Invalid parameter: @fooInt cannot be NULL or zero RETURNENDIF (ISNULL(@fooString,'') = '')BEGIN RAISERROR('Invalid parameter: @fooString cannot be NULL or empty RETURNEND