2012-02-13 130 views
0

所以在Sql Server中,似乎我不能在我的catch分支中有特定的步驟,就像我可以在PL/SQL中(我可以添加IF/ELSE檢查)。Sql Server自定義異常

所以在PL/SQL我想有這樣的事情

DECLARE 

    MY_EXCEPTION EXCEPTION; 

BEGIN 

    //My Error is Raised 

EXCEPTION 
    WHEN MY_EXCEPTION THEN 
    //Perform actions 

END 

別人是如何處理的?與使用IF語句查看錯誤並執行操作相比,TRY/CATCH有沒有更優雅的解決方案?

感謝,

小號

回答

3

什麼樣的操作?你的意思是你想在其他地方聲明異常A被記錄,異常B被忽略,並讓你的catch塊繼承這些動作? SQL Server 2012增加了THROW,這樣你就可以做其他事情(記錄,發送電子郵件等等),然後基本上重新拋出觸發捕獲的錯誤 - 但是沒有辦法定義錯誤處理等等除非您將錯誤編號,嚴重程度等傳遞給存儲過程(否則邏輯可以在過程中完成,而不是在CATCH塊中)。簡單的例子:

CREATE PROCEDURE dbo.CustomErrorHandler 
    @ErrorNumber INT, 
    @ProcID INT 
AS 
BEGIN 
    IF @ErrorNumber = 8134 
    BEGIN 
     PRINT 'Oh, it was just divide by 0 in ' 
      + COALESCE(OBJECT_NAME(@ProcID), 'ad hoc'); 
     RETURN; 
    END 

    IF @ErrorNumber = 208 
    BEGIN 
     PRINT 'Invalid object access!'; 
     -- send e-mail about invalid object access 
     RETURN; 
    END 

    /* other custom handling for other exceptions */ 

    RAISERROR('Unhandled exception I guess?', 11, 1); 
END 
GO 

然後,你可以用各種異常玩(即通過解析階段很好,那些,至少):

BEGIN TRY 
    SELECT 1/0; --8134 
    --EXEC('SELECT * FROM splunge;'); --208 
END TRY 
BEGIN CATCH 
    DECLARE 
     @e INT = ERROR_NUMBER(), 
     @p INT = @@PROCID; 

    EXEC dbo.CustomErrorHandler @e, @p; 
END CATCH 

有關錯誤處理聖經看到厄蘭的文章http://www.sommarskog.se/error-handling-I.htmlhttp://www.sommarskog.se/error-handling-II.htmlhttp://www.sommarskog.se/error_handling_2005.html

+0

謝謝@AaronBertrand我會玩你的劇本,我很欣賞這個例子。看起來不像任何sommarskog鏈接工作?我曾試圖打他的網站幾次,並沒有出現它存在了嗎? – scarpacci 2012-02-13 21:14:37

+0

這些網站正在爲我工​​作。嘗試從不同的瀏覽器或家庭/工作而不是工作/家庭。也許該域名被阻止或者您有DNS問題。 – 2012-02-13 21:15:40

+0

可能是工作領域的問題....我會嘗試從家中。謝謝Aaron。 – scarpacci 2012-02-13 21:25:20

0

在最近的SQL Server,你可以使用try catch塊,如:

BEGIN try 

代碼

END try 

BEGIN catch 

做任何你需要異常

END catch  

的情況下做在舊版本中你被卡住

IF @@ERROR > 0 THEN BEGIN 

做你的東西

END IF