select @@trancount as a
begin try
begin tran
select @@trancount as a1
insert into a2a ( id1 )
values ( 'a' )
commit tran;
end try
begin catch
select @@trancount as a2
rollback tran;
select error_message() as errormessage ,
error_severity() as errorseverity ,
error_state() as errorstate
end catch
select @@trancount as b
第一次執行時,無法正常捕捉到錯誤,並執行catch的**,返回錯誤資訊
第二次執行,就能正常捕捉。且後續再執行就都正常了。
同樣的**,執行2次出現完全不同的結果。這是很讓人費解的。
首先 看第一次執行報錯,看這個錯誤的級別編號是16。
try catch 不能捕捉什麼樣的錯誤
嚴重級別為 10 或更低的錯誤,屬於警告或資訊性訊息。
嚴重級別為 20 或更高且終止會話的 sql server 資料庫引擎任務處理的錯誤。此類問題過於嚴重資料庫引擎會直接終止會話。所以無法往後繼續執行。
總之,就是能捕捉嚴重級別大於10,且不會嚴重到之前終止會話的錯誤
關於嚴重級別 和 描述:
「資料庫引擎錯誤嚴重性」
那我們前面的例子錯誤級別16,的確是屬於可以捕捉的情況。那為什麼會有這個問題。跟執行計畫的產生有關係。因為你第一次執行的時候,sql server 在需要編譯sql 語句,產生執行計畫。就是這個時候執行計畫還沒有。所以他無法往下面繼續執行。就無法catch到。第二次,以及後面幾次再執行,因為已經快取了執行計畫。所以可以catch到。
我們執行完第一次之後可以檢視對應的執行計畫
然後再執行,就可以成功捕捉了。如果我們把執行計畫清除掉
dbcc freeproccache 或者使用option(recomplile)進行重編譯。那麼結果就會是一直無法捕捉。
recover 沒有捕獲異常 golang捕獲異常
go語言追求簡潔優雅,所以,go語言不支援傳統的 try catch finally 這種異常,因為go語言的設計者們認為,將異常與控制結構混在一起會很容易使得 變得混亂。因為開發者很容易濫用異常,甚至乙個小小的錯誤都丟擲乙個異常。在go語言中,使用多值返回來返回錯誤。不要用異常代替錯誤,更不要用來...
SQL Server Try Catch錯誤處理
一。語法要點 begin try end try begin catch end catch 異常部分 在 catch 塊的作用域內,可以使用以下系統函式來獲取導致 catch 塊執行的錯誤訊息 error number 返回錯誤號。error severity 返回嚴重性。error state ...
Python程式設計思想(33) 異常類與多異常捕獲
python程式設計思想 總目錄 python程式設計思想 專欄 當 python直譯器接收到異常物件時,如何為該異常物件尋找 except塊呢?注意到前面的 中的except塊,這個塊是專門用於處理該異常類及其子類的異常例項。當 python直譯器接收到異常物件後,會依次判斷該異常物件是否是 ex...