在编写程序时,我偶尔会遇到想要中止程序的情况,即使这种情况不一定会触发错误。
比方说,如果我不想让 John 能够运行这个过程,我会做这样的事情:
IF @UserName = 'John'
BEGIN
RAISERROR('John, get out', 16, 1);
RETURN 1;
END
我真的没有理由返回 1,它主要是 shell 脚本的残余,我愿意寻找更好的方法来做到这一点。
有没有更好的方法来返回错误消息并将控制权返回给调用者,以应对严格来说不是错误的意外情况?我对减少字符或代码行的数量不感兴趣。我只是有一种直觉说“这可能不是解决这个问题的最佳方法”,我很好奇是否有更聪明的方法来做到这一点。
一种替代方法是始终使用TRY/CATCH
,因为RAISERROR
严重性为 1-19 会将控制权交给 catch 子句。
例子:
BEGIN TRY
PRINT 'Before RAISERROR';
RAISERROR('Time for errors', 16, 1);
PRINT 'After RAISERROR'
END TRY
BEGIN CATCH
DECLARE @Msg NVARCHAR(255) = ERROR_MESSAGE()
PRINT 'Inside CATCH'
RAISERROR(@Msg, 16, 1)
END CATCH
输出:
Before RAISERROR
Inside CATCH
Msg 50000, Level 16, State 1, Line 13
Time for errors
缺点:需要TRY/CATCH
块的存在。
您可以使用
THROW
上面的语句更简洁一些,因为它只是一条语句,不需要 the
RETURN
所以你也可以去掉BEGIN
andEND