什麼樣的操作?你的意思是你想在其他地方聲明異常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.html,http://www.sommarskog.se/error-handling-II.html和http://www.sommarskog.se/error_handling_2005.html
謝謝@AaronBertrand我會玩你的劇本,我很欣賞這個例子。看起來不像任何sommarskog鏈接工作?我曾試圖打他的網站幾次,並沒有出現它存在了嗎? – scarpacci 2012-02-13 21:14:37
這些網站正在爲我工作。嘗試從不同的瀏覽器或家庭/工作而不是工作/家庭。也許該域名被阻止或者您有DNS問題。 – 2012-02-13 21:15:40
可能是工作領域的問題....我會嘗試從家中。謝謝Aaron。 – scarpacci 2012-02-13 21:25:20