捕捉異常:try---catch
SQL提供了和編程語言類似的try-catch機制,幫助存儲過程更加健壯,不至於遇到任何錯誤就終結存儲過程。在try的語句塊中遇到異常后,會暫停執行try的SQL語句,並跳轉到最近的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() --返回錯誤消息的完整文本。