TRY 与 CATCH 捕获错误!

SQL Server 中的函数与存储过程编写

Meghan Kwartler

IT Consultant

是否进行错误处理

什么是错误处理?

  • 预判、检测并解决错误
  • 保持正常执行流程
  • 融入初始设计

没有错误处理会怎样?

  • 突然中断或停止执行
  • 仅给出缺乏上下文的泛化错误信息
SQL Server 中的函数与存储过程编写

让我们来 TRY

ALTER PROCEDURE dbo.cusp_TripSummaryCreate
  @TripDate nvarchar(30),
  @RideHrs numeric,

@ErrorMsg nvarchar(max) = null OUTPUT
AS BEGIN BEGIN TRY INSERT INTO TripSummary (Date, TripHours) VALUES (@TripDate, @RideHrs) END TRY ........
SQL Server 中的函数与存储过程编写

开始 CATCH

ALTER PROCEDURE dbo.cusp_TripSummaryCreate
  @TripDate nvarchar(30),
  @RideHrs numeric, 
  @ErrorMsg nvarchar(max) = null OUTPUT
AS
BEGIN
  BEGIN TRY
      INSERT INTO TripSummary (Date, TripHours)
      VALUES (@TripDate, @RideHrs)
  END TRY
  BEGIN CATCH
      SET @ErrorMsg = 'Error_Num: ' +
      CAST (ERROR_NUMBER() AS varchar) +
      ' Error_Sev: ' + 
      CAST(ERROR_SEVERITY() AS varchar) +  
      ' Error_Msg: ' + ERROR_MESSAGE()
  END CATCH
END
SQL Server 中的函数与存储过程编写

给我看看这个错误…

DECLARE @ErrorMsgOut as nvarchar(max)

EXECUTE dbo.cusp_TripSummaryCreate 
        @TripDate = '1/32/2018',
        @RideHrs = 100,
        @ErrorMsg = @ErrorMsgOUT OUTPUT

SELECT @ErrorMsgOut as ErrorMessag
ErrorMessage
-------------------------------------------------
Error_Num: 241 Error_Sev: 16 
Error_Msg: Conversion failed when converting date and/or time from 
           character string
SQL Server 中的函数与存储过程编写

THROW vs RAISERROR

THROW

  • SQL Server 2012 引入
  • 简单易用
  • 后续语句将不会执行

RAISERROR

  • SQL Server 7.0 引入
  • 生成新错误,无法获取原始错误详情(如出错行号)
  • 后续语句可以执行
SQL Server 中的函数与存储过程编写

轮到您来 CATCH!

SQL Server 中的函数与存储过程编写

Preparing Video For Download...