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
Istruzioni dell'esercizio
- Dichiara una variabile di tipo testo,
exc_context, per contenere il contesto dello stack. - Memorizza
PG_EXCEPTION_CONTEXTnella nostra variabileexc_contextnel primo gestore. - Memorizza
PG_EXCEPTION_DETAILnella nostra variabileexc_detailnel 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;