Захоплення контекстного стека
Отримання контексту стека, подібного до 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;