sql >> Database >  >> RDS >> Sqlserver

Opname van SQL Server-aanroepstack bij het rapporteren van fouten

Ok, ik zal onze foutafhandeling weer toevoegen :-)

De functies ERROR_%() zijn zichtbaar voor het bereik van het CATCH-blok. Dit betekent dat je ze kunt gebruiken in een opgeslagen proc- of functieaanroep in elk CATCH-blok

En met geneste opgeslagen processen is het handig om te weten wat de fout heeft veroorzaakt en wat de fout registreert

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

Dit is hoe dan ook het basisidee:elk CATCH-blok is eenvoudig, het werk gaat door in de error handler. Bijvoorbeeld ERROR_NUMBER() . toevoegen als je wilt



  1. Geaggregeerde functie in MySQL - lijst (zoals LISTAGG in Oracle)

  2. Heeft iemand ooit PayPal Website Payments Standard met SESSION-variabelen gebruikt?

  3. Postgresql-adapter (pg):kon geen verbinding maken met de server

  4. Euro- en dollarteken invoegen in een kolom in mysql