gpt4 book ai didi

c# - SQL 服务器 : Rethrow exception with the original exception number

转载 作者:太空狗 更新时间:2023-10-29 18:05:44 28 4
gpt4 key购买 nike

我在有两条 INSERT 指令的存储过程中使用 TRY CATCH block 。

如果出现问题,CATCH block 会负责回滚所有所做的更改并且它工作正常,除了一件事!

我的 ASP.NET 应用程序捕获的异常是编号为 50000 的 SqlException。这不是原来的编号! (我期待的数字是 2627)

在异常的 Message 属性中,我可以看到原始的异常编号和格式化的消息。

如何获取原始异常编号?

try
{
// ... code
}
catch
(SqlException sqlException)
{
switch (sqlException.Number)
{
// Name already exists
case 2627:
throw new ItemTypeNameAlreadyExistsException();

// Some other error
// As the exception number is 50000 it always ends here!!!!!!
default:
throw new ItemTypeException();
}
}

现在返回值已经被使用了。我想我可以使用输出参数来获取异常编号,但这是个好主意吗?

如何获取异常编号?谢谢

PS:这是必需的,因为我有两个 INSERT 指令。

最佳答案

你可以像这样重新抛出它:

..
END TRY
BEGIN CATCH
DECLARE @errnum int;
SELECT @errnum = ERROR_NUMBER();
RAISERROR (@errnum, 16, 1);
END CATCH

但是,由于 ERROR_NUMBER() 的 sys.messages 行中的 %s 等占位符,您很可能失去意义

你可以做这样的事情来包含数字并重新抛出原始消息

..
END TRY
BEGIN CATCH
DECLARE @errnum nchar(5), @errmsg nvarchar(2048);
SELECT
@errnum = RIGHT('00000' + ERROR_NUMBER(), 5),
@errmsg = @errnum + ' ' + ERROR_MESSAGE();
RAISERROR (@errmsg, 16, 1);
END CATCH

前 5 个字符是原始数字。

但如果您有嵌套代码,那么您将得到“00123 00456 错误文本”。

就个人而言,我只处理 SQL 异常编号以将我的错误 (50000) 与我的代码未运行的引擎错误(例如缺少参数)分开。

最后,您可以将其传递给返回值。

我问了一个问题:SQL Server error handling: exceptions and the database-client contract

关于c# - SQL 服务器 : Rethrow exception with the original exception number,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1882788/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com