ÎncepețiÎncepe gratuit

Capturarea contextului stivei

Obținerea contextului stivei – similar cu un stack trace din alte limbaje – este o metodă puternică de depanare a funcțiilor complexe și imbricate.

În codul de mai jos, vrem să capturăm contextul stivei și să îl înregistrăm în handlerele de excepții ale ambelor blocuri imbricate. Apoi, vom analiza rezultatul din tabelul de erori pentru a identifica ce cauzează excepția în această funcție.

Acest exercițiu face parte din cursul

Tranzacții și gestionarea erorilor în PostgreSQL

Vezi cursul

Instrucțiuni pentru exercițiu

  • Declară o variabilă text, exc_context, pentru a reține contextul stivei.
  • Stochează PG_EXCEPTION_CONTEXT în variabila exc_context din primul handler.
  • Stochează PG_EXCEPTION_DETAIL în variabila exc_detail din cel de-al doilea handler.
  • Înregistrează atât mesajul de eroare, cât și contextul stivei în ambele blocuri.

Exercițiu interactiv practic

Încearcă acest exercițiu completând acest cod de exemplu.

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;
Editează și rulează codul