SQL Server Try Catch 異常捕捉

2022-07-16 11:54:09 字數 1455 閱讀 6190

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...