【问题标题】:Error handling problem in SQL ServerSQL Server 中的错误处理问题
【发布时间】:2011-09-07 07:34:30
【问题描述】:

我正在使用 C# 和一个类型化的数据集,该数据集链接到 SQL Server Express 数据库中的存储过程。在存储过程中,我使用try catch 进行错误处理。

这是我的 catch 块:

begin catch
    select 
        error_number() as errorNumber, 
        error_severity() as errorSeverity,
        error_state() as errorState,
        error_procedure() as errorProcedure,
        error_line() as errorLine,
        error_message() as errorMessage
end catch
  1. try catch 是处理 db 中错误的最佳方式吗??

  2. 由于SQL Server会将错误信息作为表返回,如何识别返回的表是满数据还是包含错误信息??

编辑: 好的,所以我得到了异常并重新抛出它??但为什么?我的意思是,如果我一开始没有抓住它,它就会冒泡到我的应用程序中,我可以在那里管理它。那我为什么要使用try catch??

【问题讨论】:

    标签: c# sql-server database


    【解决方案1】:

    可以是处理存储过程中错误的好方法,但通常你会这样做以将错误记录到表中:

    begin catch
        insert into ErrorLog
        select 
            error_number() as errorNumber, 
            error_severity() as errorSeverity,
            error_state() as errorState,
            error_procedure() as errorProcedure,
            error_line() as errorLine,
            error_message() as errorMessage
    end catch
    

    但是,基于异常只应在异常情况下发生的事实,您几乎肯定希望重新抛出错误,以便您的代码能够以最合理的方式处理此异常。

    在 sql server 中,这是使用 RAISERROR (docs) 命令实现的。

    您的代码最终会看起来像:

    BEGIN CATCH
        DECLARE @ErrorMessage NVARCHAR(4000);
        DECLARE @ErrorSeverity INT;
        DECLARE @ErrorState INT;
    
        SELECT 
            @ErrorMessage = ERROR_MESSAGE(),
            @ErrorSeverity = ERROR_SEVERITY(),
            @ErrorState = ERROR_STATE();
    
        -- You could log the error here
        INSERT INTO ErrorLog(message, severity, state)
        VALUES(@ErrorMessage, @ErrorSeverity, @ErrorState)
    
        -- Use RAISERROR inside the CATCH block to return error
        RAISERROR (@ErrorMessage, -- Message text.
                   @ErrorSeverity, -- Severity.
                   @ErrorState -- State.
                   );
    END CATCH;
    

    【讨论】:

      【解决方案2】:

      请记住,如果您需要向应用程序报告异常(如在 C# 中的 catch (SQLException ex) 中),您的 SPROC catch 块将需要重新抛出 (RAISERROR) 异常,并确保严重级别是 > 10 TRY and RAISERROR in T-SQL

      【讨论】:

        【解决方案3】:

        另外请注意,如果您的事务被回滚,您的日志记录也是如此 - 最终没有日志条目...

        【讨论】:

          猜你喜欢
          • 2013-10-19
          • 2015-06-28
          • 1970-01-01
          • 1970-01-01
          • 2016-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-31
          相关资源
          最近更新 更多