RaiseError没有提高错误吗?

时间:2010-09-04 04:51:24

标签: asp.net sql-server tsql ado.net

为什么错误不会出现在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

由于

2 个答案:

答案 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