用 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 與 RAISERROR 比一比

THROW

  • 於 SQL Server 2012 引入
  • 簡潔、好用
  • 後續陳述式將「不會」執行

RAISERROR

  • 於 SQL Server 7.0 引入
  • 產生新錯誤,無法讀取原始錯誤細節(如最初發生錯誤的行號)
  • 後續陳述式可以執行
在 SQL Server 中撰寫函式與預存程序

換你來 CATCH!

在 SQL Server 中撰寫函式與預存程序

Preparing Video For Download...