【发布时间】:2022-01-05 06:26:48
【问题描述】:
我在网上找到了这段代码:
...
END TRY
BEGIN CATCH
DECLARE
@ErMessage NVARCHAR(2048),
@ErSeverity INT,
@ErState INT
SELECT
@ErMessage = ERROR_MESSAGE(),
@ErSeverity = ERROR_SEVERITY(),
@ErState = ERROR_STATE()
**RAISERROR (@ErMessage,
@ErSeverity,
@ErState )**
END CATCH
我的问题是:在 CATCH 块中,为什么作者必须使用 @ErMessage、@ErServerity、@ErState 声明参数而不仅仅是输入:
RAISERROR (ERROR_MESSAGE(), ERROR_SEVERITY(), ERRORSTATE())
【问题讨论】:
-
您使用的是哪个 dbms? (上面的代码是特定于产品的。)
-
@jarlh - 我相信 SQL Server。这是我找到代码的地方:sqlhints.com/2013/06/30/…
-
无论如何,您都应该使用
THROW重新抛出错误 - 如果原始错误是严重性高的错误并且具有文章中可能提到的其他缺点,则编写的RAISERROR代码可能会失败你链接 -
事实上,你可能不应该打扰
TRYCATCH,除非你真的打算处理错误。就目前而言,您只会弄乱客户端错误处理,因为有时会返回多条消息,您也会丢失错误号。THROW也应该只像这样使用THROW;所以你重新抛出原来的异常
标签: sql sql-server variables raiserror