IniziaInizia gratis

Acquisire uno stack di contesto

Recuperare il contesto dello stack, simile a una stack trace in altri linguaggi, è un modo potente per effettuare il debug di funzioni complesse e annidate.

Nel codice qui sotto, vogliamo catturare il contesto dello stack e registrarlo nei gestori delle eccezioni di entrambi i blocchi annidati. Poi, vogliamo esaminarne l’output nella tabella degli errori per capire cosa sta causando l’eccezione in questa funzione.

Questo esercizio fa parte del corso

Transazioni e gestione degli errori in PostgreSQL

Visualizza il corso

Istruzioni dell'esercizio

  • Dichiara una variabile di tipo testo, exc_context, per contenere il contesto dello stack.
  • Memorizza PG_EXCEPTION_CONTEXT nella nostra variabile exc_context nel primo gestore.
  • Memorizza PG_EXCEPTION_DETAIL nella nostra variabile exc_detail nel secondo gestore.
  • Registra sia il messaggio di errore sia il contesto dello stack in entrambi i blocchi.

Esercizio pratico interattivo

Prova a risolvere questo esercizio completando il codice di esempio.

DO $$
DECLARE
   exc_message text;
   exc_details text;
   -- Declare a variable, exc_context to hold the exception context
   ___ ___;
BEGIN
    BEGIN
    	INSERT INTO patients (a1c, glucose, fasting) values (5.6, 93, TRUE),
        	(6.3, 111, TRUE),(4.7, 65, TRUE);
    EXCEPTION
        WHEN others THEN
        -- Store the exception context in exc_context
        GET STACKED DIAGNOSTICS exc_message = MESSAGE_TEXT,
                                ___ = ___;
        -- Record both the msg and the context
        INSERT INTO errors (msg, context) 
           VALUES (___, ___);
    END;
	BEGIN
    	UPDATE patients set fasting = 'true' where id=1;
    EXCEPTION
        WHEN others THEN
        -- Store the exception detail in exc_details
        GET STACKED DIAGNOSTICS exc_message = MESSAGE_TEXT,
                                ___ = ___;
        INSERT INTO errors (___, ___) 
           VALUES (exc_message, exc_context);
    END;
END$$;
SELECT * FROM errors;
Modifica ed esegui il codice