[鐵人賽][Denali 新特性探險12]Throw Statement

[鐵人賽][Denali 新特性探險12]Throw Statement

透過Throw Statement 你將發現原來catch runtime exception 是那麼的簡單且方便,

Throw Statement可說大大改善了以往 Error Handling 資訊不完全的詬病,

下面我將帶你體驗出SQL2005/2008 和 Denali 兩者明顯優劣。

 

我個人覺得有兩大優點:

優點1:標示出最原始錯誤行數。

優點2:寫法更簡便且單純。

 

Using RAISERROR and Print(SQL2005/2008)

begin tran mytran        
begin try            
declare @money varchar(100);        
select 1/0;
commit tran mytran          
end try
begin catch
--回復交易
rollback tran mytran;
--回傳自訂錯誤訊息
RAISERROR ('除法運算錯誤',16,1) 
--回傳參考它的CATCH 區塊範圍特定的錯誤訊息(寫法有點麻煩)
print ERROR_NUMBER()+ ERROR_SEVERITY()+ERROR_STATE()+ERROR_PROCEDURE()+ERROR_LINE()+ERROR_MESSAGE();
end catch    

image

從錯誤訊息我們只知道除以零的錯誤(因為轉換資料類型 int 失敗),

但錯誤行數卻無法讓我們立刻知道最原始的錯誤發生在那一行(原始的錯誤行數如下圖)。

 

image

 

Using Throw(Denali )

begin tran mytran        
begin try            
declare @money varchar(100);        
select 1/0;
commit tran mytran          
end try
begin catch
--回復交易
rollback tran mytran;
--Using Throw
Throw 
end catch    

image

在錯誤訊息上你可以看到原始的錯誤行數,使用滑鼠點兩下便會Highlight錯誤行數,

如果你的SP、TSQL寫了幾百行、千行,那你一定會很感動 Throw 怎麼那麼貼心。

 

回傳自訂組合錯誤訊息

image

注意:這裡雖使用 throw ,但無法標示出原始的錯誤行數

 

可以透過 sys.messages 查看 5008 內建的錯誤訊息。

select * from sys.messages 
where language_id =1028
and message_id =5008 

image

 

參考:THROW