【问题标题】:Distinguish between validation exception and Unhandled error in stored procedure区分存储过程中的验证异常和未处理错误
【发布时间】:2017-12-06 13:13:50
【问题描述】:

我为我的应用程序编写了许多存储过程。一些存储过程根据项目要求返回验证异常,而在某些情况下,存储过程返回未处理的致命错误,例如

“外键引用错误”、“期望参数未提供”等

现在我需要区分我的 C# 代码中的这些错误。如果出现未处理的致命错误,我需要在数据库中插入错误日志。

关于如何区分这两种类型的任何建议。

注意:我使用 RAISERROR 语句返回验证异常,例如

RAISERROR(@ErrorMsg,16,1)

更新 1:

我想每个人都错误地解释了我的实际问题。 我可能会从 SP 中的查询执行中获得用户定义的验证异常(由 RAISERROR stmt 返回)或致命错误。我需要在我的 C# 代码中区分这两种类型。这两个异常都在

中捕获
catch (SqlException ex)

块。经过一番研究,我发现 ex.Number 在用户定义的验证异常的情况下为 50000,而在其他情况下则不同。

我正在考虑为此写条件。如果有任何更清洁的方法,请提出建议。

【问题讨论】:

  • try and catch 是打印您提到的错误的方法。您可以在其中处理您的错误 catch 并可以插入到您的日志中。
  • 你可以有多个 catch 块。您可以首先捕获任何 SQLException,这些将是您的 sql 执行的错误。然后是另一个 catch 块,之后将能够捕获任何其他未处理的异常。

标签: c# sql-server sql-server-2012


【解决方案1】:

你应该为这个语句设置 id 的值。

出现此错误,因为外键的 Id 被排除或因为 id 没有插入到语句中

【讨论】:

  • 你在这里想说什么?你是说他们应该为错误设置 msg_id 吗?似乎他们正在获取消息信息。
  • 使用 Try Catch 并从存储过程中删除此 RAISERROR,这样,在 catch 中返回错误消息。
【解决方案2】:

在 C# 代码中使用 Try Catch 块并从存储过程中删除您的 RAISERROR(@ErrorMsg,16,1)。

您可以在 catch 块中获取准确的错误消息并对其进行验证并写入日志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2012-01-31
    • 2018-09-05
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多