RAISERROR严重程度不同意味着什么?

时间:2009-07-14 00:46:05

标签: sql-server raiserror

我最好的google结果是this

  • 11以下是警告,而不是错误
  • 11-16可供使用
  • 16以上是系统错误
  • 11-16之间没有行为差异

但是,从BOL,“任何用户都可以指定从0到18的严重级别。”

在我的特定存储过程中,我希望将错误返回到.Net客户端应用程序,因此看起来11-18之间的任何严重性级别都可以解决问题。有没有人有关于每个级别的含义以及如何使用它们的任何权威信息?

2 个答案:

答案 0 :(得分:101)

Database Engine Severity Levels

您应该返回16.是默认的,最常用的错误级别:

  

表示可能出现的常规错误   由用户更正。

不要返回17-18,那些表示更严重的错误,如资源问题:

  

指出不能的软件错误   由用户纠正。通知你的   系统管理员的问题。

也不要返回11-15,因为它们具有附加到每个级别的特殊含义(14 - 安全访问,15 - 语法错误,13 - 死锁等)。

16级不会终止执行。

如果您打算记录警告但仍继续执行,请使用低于10的严重性级别。

答案 1 :(得分:2)

严重级别import numpy as np from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split X = [[1, 1, 1, 1], [1, 1, 1, 1], [1, 2, 1, 1], [1, 3, 1, 1], [1, 4, 1, 1], [1, 2, 1, 1], [1, 3, 1, 1], [2, 4, 1, 1], [1, 1, 1, 1], [2, 1, 1, 1], [2, 4, 1, 1], [1, 5, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]] y = [ [1], [1], [1], [3], [2], [1], [3], [2], [1], [1], [2], [1], [1], [1], ] # Split X and y into X_ X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=1) regression_model = LinearRegression() regression_model.fit(X_train, y_train) print(regression_model.score(X_test, y_test)) # -1.1817143658810325 print(regression_model.predict([[1, 1, 1, 1]]) # [[0.9694444444444441]] 可以 终止执行。

使用RAISERROR()进行尝试捕获警告:

严重性为 16

16终止对违规行以下所有内容的执行。
但是 仅在尝试块内适用。

RAISERROR()

惊讶吗?我也是。
引发我困扰的原因还不是所有严重性- 16 都是一样的。
如果您要取消最顶部的Divide-By-Zero线的注释,则下面的任何内容都将无法运行。
除零逻辑还会 生成严重性 16 异常,
 与<{> {1}}不同,它是用完全停止来处理的。

注意:将--DECLARE @DivideByZero Int = 1/0--Uncommenting this will Skip everything below. RAISERROR (N'Before Try: Raise-Error 16.', 16, 0)--Works. SELECT 'Before Try: Select.'[Marker]--Works. BEGIN TRY RAISERROR (N'Inside Try: Raise-Error 16.', 16, 0)--Not displayed,but sends to Catch-Block. SELECT 'Inside Try: Select.'[Marker]--Skipped. END TRY BEGIN CATCH RAISERROR (N'Inside Catch: Raise-Error 16.', 16, 0)--Works. SELECT 'Inside Catch: Select.'[Marker]--Works. --RETURN --Adding Return will only skip what is After the Catch-Block for this scope only. --;THROW--Shows the RAISERROR() from the Try-Block and Halts Execution. Must include ";". END CATCH RAISERROR (N'After Try-Catch: Raise-Error 16.', 16, 0)--Works. SELECT 'After Try-Catch: Select.'[Marker]--Works. 用作捕获块中的 最后
 引发由尝试块触发的RAISERROR()事件的SQL异常。
 这将有效地停止执行。
 如果在调用;THROW之前在捕获块中存在其他行,则需要RAISERROR()分号。
如果您的逻辑正确处理了Catch-Block中的错误(并且您想继续处理
 其余的逻辑),然后使用;

结论:

不要混淆SQL-Server-Engine抛出的严重性- 16  和一个人在一起时,你会用;THROW来提高自己。
对于所有意图和目的(故意抛出自己的错误),请仅考虑2个严重级别:
  0 (用于信息或警告)和
  16 (用于在Try-Block中引发异常-将其踢出Catch-Block)。

现在的信息!

注意:如果您使用;THROW显示参考消息,
 那么我建议使用RAISERROR()

RAISERROR()

当您需要一些见识时,这在长时间批量操作中特别有用
 您在整个批次中达到某些里程碑标志时,进展如何。
通过使用WITH NOWAIT not ,您可能永远不知道信息性消息何时出现。
它们可能在整个批处理过程中间歇出现,或者在批处理完成时一次全部出现。