为什么错误不会出现在UI层?我正在使用ExecuteScalar
BEGIN CATCH
PRINT N'The transaction is in an uncommittable state. Rolling back transaction.'
ROLLBACK TRANSACTION;
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT @ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage,
@ErrorSeverity,
@ErrorState);
END CATCH
由于
答案 0 :(得分:1)
您只能引发用户消息,系统消息只能由引擎引发:
用户定义错误的错误号 消息应大于50000。 如果未指定msg_id, RAISERROR引发错误消息 错误编号为50000。
因此,您无法提升原始@ErrorMessage
,您必须提出新错误代码。
此外,您的catch块不正确,因为它假设是一个不可提交的事务。情况并非总是如此,在确定交易是否注定失败之前,必须检查XACT_STATE()
的结果。在许多情况下,错误处理可以继续事务。请参阅Exception handling and nested transactions。
答案 1 :(得分:0)
首先,回顾一下Remus关于嵌套事务中错误处理的文章,以便您了解事物的全部内容。
然后,尝试将错误级别强制为16.此外,当您重新抛出错误时,将原始错误信息嵌入到错误消息中,这样您就不会丢失该信息:
BEGIN TRY
SELECT 1/0
END TRY
BEGIN CATCH
DECLARE
@ErrorMessage NVARCHAR(4000)
, @ErrorNumber INT
, @ErrorSeverity INT
, @ErrorState INT
, @ErrorLine INT
SELECT
@ErrorNumber = ERROR_NUMBER()
, @ErrorSeverity = ERROR_SEVERITY()
, @ErrorState = ERROR_STATE()
, @ErrorLine = ERROR_LINE();
SET @ErrorMessage
= '>> Msg %i, Level %i, State %i, Line %i'
+ CHAR(13)+CHAR(10)+ERROR_MESSAGE()
RAISERROR (
@ErrorMessage,16,1
, @ErrorNumber
, @ErrorSeverity
, @ErrorState
, @ErrorLine
)
END CATCH