ПочатиПочніть безкоштовно

Захоплення контекстного стека

Отримання контексту стека, подібного до stack trace в інших мовах, — потужний спосіб налагоджувати складні та вкладені функції.

У наведеному нижче коді потрібно захопити контекст стека й занотувати його в обробниках винятків обох вкладених блоків. Потім перегляньте цей вивід у таблиці помилок, щоб з'ясувати, що саме спричиняє виняток у цій функції.

Ця вправа є частиною курсу

Транзакції та обробка помилок у PostgreSQL

Переглянути курс

Інструкції до вправи

  • Оголосіть текстову змінну exc_context для збереження контексту стека.
  • Збережіть PG_EXCEPTION_CONTEXT у змінній exc_context у першому обробнику.
  • Збережіть PG_EXCEPTION_DETAIL у змінній exc_detail у другому обробнику.
  • Запишіть і повідомлення про помилку, і контекст стека в обох блоках.

Інтерактивна практична вправа

Спробуйте виконати цю вправу, доповнивши цей зразок коду.

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;
Редагувати та запускати код