SQL異常捕捉


捕捉異常:try---catch

SQL提供了和編程語言類似的try-catch機制,幫助存儲過程更加健壯,不至於遇到任何錯誤就終結存儲過程。在try的語句塊中遇到異常后,會暫停執行trySQL語句,並跳轉到最近的catch代碼塊中繼續執行。

語法框架

 

Begin try
    Begin
        [需要執行的SQL語句]
    End
End try

Begin catch
    Begin
        [在上一個begin try和end try中一旦產生異常,就會停止執行
        剩下的語句,並跳轉到begin catch和end catch的語句中繼續
        執行]
    End
End catch

 

 

 

制造異常

SQL server為例,它提供了raiserror()函數用於拋出異常。其實有很多編程語言都提供了相似的異常捕獲機制,因此這種機制對於有編程基礎的小伙伴來說會非常熟悉。

raiserror()的語法結構

1 RAISERROR ( { msg_id | msg_str | @local_variable }        
2             { ,severity ,state }        
3             [ ,argument [ ,...n ] ]
4           )       
5    [ WITH option [ ,...n ] ]

 

這個函數中各個參數的意義可以參考這一篇文章,我在此不做太多贅述:

https://www.cnblogs.com/xugang/archive/2011/04/09/2010216.html

這五個參數中的后兩個可以不填,因此可以將這個函數簡化成一下形式:

1 RAISERROR (msg_str,severity,state)       
2  /*
3 msg_str:用戶自定義的錯誤消息
4 Severity:錯誤級別。任何用戶都可以指定 0 到 18 之間的嚴重級別。[0,10]的閉區間內,不會跳到catch;如果是[11,19],則跳到catch;如果[20,無窮),則直接終止數據庫連接
5 State:介於 1 至 127 之間的任意整數。(state 默認值為1)當state 值為 0 或大於 127 時會生成錯誤!
6 */

 

raiserror()的簡單用法

在剛接觸編程時,我對這種人為產生異常的行為非常困惑——我們寫SQL語句都是盡量避免報錯,為什么還要主動生成錯誤?

在實際使用中,這個函數常常配合判斷語句用於定位錯誤位置,區分錯誤類型。

Begin try
    Begin
        If (條件一)
            raiserror(錯誤1,11,1)
        If (條件二)
            raiserror(錯誤2,11,2)
        If (條件三)
            raiserror(錯誤3,11,3)
    End
End try
Begin catch
    Begin
        [遇到異常后執行的語句]
    End    
End catch

 

常用的和異常相關的系統函數

通過這些函數可以幫助我們更好的定位和判斷錯誤信息

ERROR_NUMBER() --返回錯誤號。
ERROR_SEVERITY() --返回嚴重性。
ERROR_STATE() --返回錯誤狀態號。
ERROR_PROCEDURE() --返回出現錯誤的存儲過程或 觸發器的名稱。
ERROR_LINE() --返回導致錯誤的例程中的行 號。
ERROR_MESSAGE() --返回錯誤消息的完整文本。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM