sql >> Database teknologi >  >> RDS >> Sqlserver

Optagelse af SQL Server-opkaldsstak ved fejlrapportering

Ok, jeg tilføjer vores fejlhåndtering igen :-)

Funktionerne ERROR_%() er synlige for omfanget af CATCH-blokken. Det betyder, at du kan bruge dem i et lagret proc eller funktionskald i hver CATCH-blok

Og med indlejrede lagrede procs er det nyttigt at vide, hvad der forårsagede fejlen, og hvad der logger fejlen

...
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

Dette er i hvert fald den grundlæggende idé:hver CATCH-blok er enkel, arbejdet fortsætter i fejlbehandleren. Tilføj f.eks. ERROR_NUMBER() hvis du vil



  1. Har brug for en mysql-forespørgsel

  2. Sådan kombinerer du dato fra et felt med tid fra et andet felt - MS SQL Server

  3. Bedste praksis for et mysql-dataversioneringssystem

  4. Upload PDF-fil til mysql BLOB ved at bruge java.sql.PreparedStatement uden korruption