[鐵人賽][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
從錯誤訊息我們只知道除以零的錯誤(因為轉換資料類型 int 失敗),
但錯誤行數卻無法讓我們立刻知道最原始的錯誤發生在那一行(原始的錯誤行數如下圖)。
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
在錯誤訊息上你可以看到原始的錯誤行數,使用滑鼠點兩下便會Highlight錯誤行數,
如果你的SP、TSQL寫了幾百行、千行,那你一定會很感動 Throw 怎麼那麼貼心。
回傳自訂組合錯誤訊息
注意:這裡雖使用 throw ,但無法標示出原始的錯誤行數。
可以透過 sys.messages 查看 5008 內建的錯誤訊息。
select * from sys.messages
where language_id =1028
and message_id =5008
參考:THROW