Ok, I'll add our error handling back in :-)
The ERROR_%() functions are visible to the scope of the CATCH block. This means you can use them in a stored proc or function call in each CATCH block
And with nested stored procs, it's useful to know what caused the error and what's logging the error
...
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 AND @starttrancount = 0
ROLLBACK TRANSACTION
EXEC dbo.MyExceptionHandler @@PROCID, @errmsg OUTPUT;
RAISERROR (@errmsg, 16, 1);
END CATCH
---with this handler (cut down version of ours)
CREATE PROCEDURE dbo.MyExceptionHandler
@CallerProcID int,
@ErrorMessage varchar(2000) OUTPUT
WITH EXECUTE AS OWNER --may be needed to get around metadata visibility issues of OBJECT_NAME
AS
SET NOCOUNT, XACT_ABORT ON;
BEGIN TRY
SET @ErrorMessage = --cutdown
CASE
WHEN @errproc = @callerproc THEN --Caller = error generator
--build up stuff
ELSE --Just append stuff --Nested error stack
END;
IF @@TRANCOUNT = 0
INSERT dbo.Exception (Who, TheError, WhatBy, LoggedBy)
VALUES (ORIGINAL_LOGIN()), RTRIM(ERROR_MESSAGE()), ERROR_PROCEDURE(), OBJECT_NAME(@CallerProcID));
END TRY
BEGIN CATCH
--and do what exactly?
END CATCH
GO
This is the basic idea anyway: each CATCH block is simple, the work goes on in the error handler. Eg append ERROR_NUMBER()
if you want to
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…