首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >区分我引发的错误和其他Server错误

区分我引发的错误和其他Server错误
EN

Database Administration用户
提问于 2022-04-04 11:46:31
回答 1查看 217关注 0票数 0

在我的存储过程中,当业务规则被打破时,我会引发一个错误,该错误会弹出到C#客户端应用程序并显示给用户。例如:

代码语言:javascript
复制
RAISERROR('Hey, you cannot do that because blah blah blah', 16, 1);

我希望区分我引发的错误和其他Server错误,因为我只希望显示我的错误。

我认为这是向客户端应用程序发送消息的唯一方法,这是要显示的用户消息:严重性级别、状态、返回代码。但我觉得我应该离开严重程度。

  • 我怎么告诉我的客户应用程序?
  • 我应该使用哪些代码或数字,而这些代码或数字还没有被使用?
  • 还是有别的办法我没想过?

或者我应该这么做:

代码语言:javascript
复制
THROW 50000, 'Hey, you cannot do that!', 1;  

编辑(13-4月-2022年)我问Erland Sommarskog,他的回答帮助我意识到如果你用这个

代码语言:javascript
复制
RAISERROR('Hey, you cannot do that because blah blah blah', 16, 1);

客户端应用程序...then将始终获得50000作为错误号。使用RAISERROR,您可以使用参数化消息。您只需要知道RAISERROR不会退出批处理。所以,对我来说,瑞瑟尔赢了。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2022-04-04 12:11:31

无论如何,您应该使用THROW,因为微软的文档中有些不推荐使用RAISERROR

RAISERROR语句不支持SET XACT_ABORT。新的应用程序应该使用抛出而不是RAISERROR。

根据THROW上的文档,error_number参数必须大于或等于50000,小于或等于2147483647。(前49 999个错误代码已为本机服务器生成的错误保留。)

如果在客户端应用程序中使用C#,那么当应用程序代码从Server接收到异常时,该异常对象将传递给SQLException对象。(如果仍然使用旧的程序集引用,则为System.Data.SqlException对象。)这将公开您抛出的自定义异常的所有属性,特别是Number属性将包含您的自定义错误代码。

就我个人而言,我喜欢为我在Server实例中使用的每个用户定义的错误代码保留一个Enum集合。

如果您确实选择继续使用RAISERROR,则还可以考虑使用sp_addmessage创建和使用自己的用户定义错误消息,以此将实际消息重构为Server中的自定义错误代码,以便每次抛出相同的异常时都可以引用相同的对象。(不过,我个人从未使用过这个特性。)但我个人建议坚持使用THROW

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/310513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档