使用Try…Catch塊進行T-SQL錯誤處理

        SQL Server的錯誤處理或異常處理一直都是T-SQL開發中比較麻煩的部分。在過去,每一條語句運行後,你都要手動地進行錯誤檢查,然後逐個錯誤的進行處理。SQL Server事務管理同樣非常麻煩,你需要找出事務的狀態,然後恰當的將其回滾或者提交。

而今,通過在SQL Server 2005中爲T-SQL添加Try…Catch塊,微軟給我們提供了新的,更加健壯的錯誤處理能力。在本文中,我們將看到Try…Catch塊是如何工作的,並告訴你如何你在代碼使用他們。同時,我們還將提供一些使用以前的方法處理問題和使用現代方法處理問題的對比,是你更好的理解如何使用Try…Catch。

Try…Catch的定義
  爲了理解Try…Catch塊,你必須先明白異常處理的概念。異常處理非常簡單:在執行你的代碼時,那些非計劃之內發生的事情就是異常,你需要做一些事情對它進行處理。至於如何處理異常,則由開發人員,也就是你來決定。

 爲了是你的T-SQL代碼可以處理異常,你就需要使用Try…Catch塊。如果你使用過Visual Studio,那麼你可能對Try…Catch塊的概念很熟悉。T-SQL中的Try…Catch塊雖然與完全成熟的Visual Studio中的很相似,但實際上它少了一些選項。在使用Try…Catch塊時,將你所編寫的需要運行的T-SQL代碼放入Try塊中。如果在運行這段代碼時,如果一個嚴重級別是10級或者更高的錯誤發生,就會轉到Catch塊中運行那裏面的異常處理代碼。它的基本結構如下所示:

BEGIN TRY
  [T-SQL代碼寫在這裏]
  END TRY
  BEGIN CATCH
  [異常處理代碼寫在這裏]
  END CATCH

在T-SQL中使用Try…Catch塊時,你需要注意以下這些關鍵問題:

   Try塊後面必須要直接接一個Catch塊,否則就會發生一個錯誤。
   Try…Catch不能嵌套。
    如果Try塊中的代碼沒有故障,將跳過Catch塊,執行Catch塊後的第一條語句。
    當Catch塊中的代碼運行完畢後,將執行Catch塊後的第一條語句。

處理錯誤

  當一個錯誤發生後,你作爲一名開發者需要決定如何處理它。因爲你不能像.Net語言那樣,將控制權重新轉回引起錯誤的代碼上,你所能做的可能就是將問題記入日誌,並將所執行的事務進行回滾。爲了幫助記錄,有一些系統函數提供了錯誤的更全面的信息,這些函數的具體內容如下所示:

  •    ERROR_NUMBER() – 返回錯誤號。
  •    ERROR_SEVERITY() – 返回錯誤嚴重級別。
  •    ERROR_STATE() – 返回錯誤狀態。
  •    ERROR_PROCEDURE() - 返回錯誤所在的存儲過程或觸發器的名稱。
  •    ERROR_LINE() - 返回錯誤所在行的行號。
  •    ERROR_MESSAGE() - 返回錯誤的實際信息。

  使用這些函數,你可以記錄錯誤的詳細信息,並將這些信息返回給調用它的過程或者記錄,以便對錯誤進行追蹤和修復。這些函數只能在Catch塊被調用,在其它地方使用會返回NULL。然而,這些函數可以被Catch塊中的代碼所使用。也就是說,你可以調用一個存儲過程來處理錯誤,於是這個存儲過程就可以調用這些錯誤函數。下面就是這樣的存儲過程的一個示例:

CREATE PROCEDURE spLogError
  AS
  --給應用程序返回錯誤的詳細信息
  SELECT
  ERROR_NUMBER() AS ErrNum,
  ERROR_SEVERITY() AS ErrSev,
  ERROR_STATE() as ErrState,
  ERROR_PROCEDURE() as ErrProc,
  ERROR_LINE() as ErrLine,
  ERROR_MESSAGE() as ErrMsg
  --將錯誤記入錯誤數據庫日誌
  INSERT INTO SQLErrors.dbo.ErrorLog
  VALUES(ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(),
  ERROR_PROCEDURE(), ERROR_LINE(),ERROR_MESSAGE())


      這個過程可以在你的Catch塊中被調用,用來返回和記錄錯誤的詳細信息。

BEGIN TRY

  --在這裏插入代碼:當錯誤發生時,控制權將被轉到Catch塊

END TRY
  BEGIN CATCH

  --這個過程將會記錄錯誤並將詳細信息返回給調用它的應用程序

EXEC spLogError
  END CATCH

  使用XACT_STATE()函數

  還有一個錯誤函數我們在前面沒有討論,那就是XACT_STATE()函數。它可以在你的Catch塊中被調用,返回你的過程中事務的準確狀態。XACT_STATE()函數的返回值及其意義如下所示:

  •    1 : 有一個活動的事務,它可以被提交或者回滾。
  •    0 : 沒有活動的事務。
  •    -1 : 有一個活動的事務,但由於有錯誤發生,事務不能被提交。

  基於這些返回值,你就可以處理你的食物。如果返回值是1,你可以正常的提交或者回滾。如果返回值是0,則並沒有打開的事務,如果嘗試提交將會產生一個錯誤。返回值-1比較特殊,它意味着有一個事物,但是它不能被提交。如果返回值是-1的話,你也不能回滾到一個保存點,而只能將整個事務進行回滾。

  錯誤和異常處理對於所有好的編程規範都是至關重要的。現在使用SQL Server 2005提供的Try…Catch塊,你可以實現更好的錯誤處理



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章