kry*_*tah 4 sql-server error-handling sql-server-2016
在编写程序时,我偶尔会遇到我想中止程序的情况,即使这种情况不一定会触发错误。
比方说,如果我不希望 John 能够运行这个程序,我会做这样的事情:
IF @UserName = 'John'
BEGIN
RAISERROR('John, get out', 16, 1);
RETURN 1;
END
Run Code Online (Sandbox Code Playgroud)
我真的没有一个很好的理由返回 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
Run Code Online (Sandbox Code Playgroud)
输出:
IF @UserName = 'John'
BEGIN
RAISERROR('John, get out', 16, 1);
RETURN 1;
END
Run Code Online (Sandbox Code Playgroud)
缺点:需要TRY/CATCH
块的存在。
Mar*_*ith 11
是否有更简洁的方法来返回错误消息并将控制权返回给调用者,以应对严格来说不是错误的不需要的情况?
您可以使用 THROW
引发异常并将执行转移到 TRY...CATCH 构造的 CATCH 块...如果 TRY...CATCH 构造不可用,则会话结束。
IF @UserName = 'John'
THROW 50000, 'John, get out', 1;
Run Code Online (Sandbox Code Playgroud)
上面的内容稍微简洁一些,因为它只是一个语句,不需要 ,RETURN
因此您也可以删除BEGIN
和END