Створіть виняток із контексту


13

Коли PostgreSQL видає виняток, є рядок "CONTEXT", наприклад:

    ERROR:  INSERT has more target COLUMNS than expressions
    LINE 3: ...
                                                         ^
    QUERY:  INSERT INTO ...
    CONTEXT:  PL/pgSQL FUNCTION "XXXXX" line 4 at SQL statement

Але коли я кидаю виняток, цього рядка немає. Я не знайшов, як це додати.

    RAISE EXCEPTION 'blablabla' USING HINT = 'blablablabla';

Чи можна додати цей рядок до мого винятку?

Відповіді:


13

Я не зміг знайти прямий спосіб вивести CONTEXTрядок із визначеним користувачем винятком. Ця опція просто не реалізована (поки що) в PostgreSQL 9.1. Прочитайте посібник тут .
Однак я знайшов ...

Обхід

... що має виконувати бездоганно . Ви можете змусити plpgsql вести себе за бажанням, зателефонувавши до іншої функції, яка викликає помилку для вас. Це працює з PostgreSQL 9.0 або новішою версією .
Для версії 8.4 вам слід здійснити незначне коригування: параметри не можуть бути призначені.

Функція викликати помилку (попередження, повідомлення, ..) із визначеним користувачем повідомленням та CONTEXT:

CREATE OR REPLACE FUNCTION f_raise(_lvl text = 'EXCEPTION'
                                 , _msg text = 'Default error msg.')
  RETURNS void AS
$func$
BEGIN
   CASE upper(_lvl)
      WHEN 'EXCEPTION' THEN RAISE EXCEPTION '%', _msg;
      WHEN 'WARNING'   THEN RAISE WARNING   '%', _msg;
      WHEN 'NOTICE'    THEN RAISE NOTICE    '%', _msg;
      WHEN 'DEBUG'     THEN RAISE DEBUG     '%', _msg;
      WHEN 'LOG'       THEN RAISE LOG       '%', _msg;
      WHEN 'INFO'      THEN RAISE INFO      '%', _msg;
      ELSE RAISE EXCEPTION 'f_raise(): unexpected raise-level: "%"', _lvl;
   END CASE;
END
$func$  LANGUAGE plpgsql;

COMMENT ON FUNCTION f_raise(text, text) IS 'Raise error or given level with msg and context.
Call from inside another function instead of raising an error directly
  to get plpgsql to add CONTEXT (with line number) to error message.
$1 .. error level: EXCEPTION | WARNING | NOTICE | DEBUG | LOG | INFO
$2 .. error message';

Використовуйте функцію, щоб створити помилку на зразок цієї:

CREATE OR REPLACE FUNCTION test_err(text)
  RETURNS void AS
$func$
BEGIN
   -- do stuff    

   IF TRUE THEN  -- some condition here?
      -- instead of raising error like this:
      -- RAISE EXCEPTION 'unexpected parameter: "%"', $1;
      PERFORM f_raise('EXCEPTION', 'My message "' || $1 || '"');
   END IF;
END
$func$  LANGUAGE plpgsql;

Виклик:

SELECT test_err('wrong parameter');

Значення за замовчуванням та названі параметри

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

SELECT f_raise();
SELECT f_raise('WARNING');
SELECT f_raise(_msg := 'boohoo');
SELECT f_raise(_lvl := 'WARNING');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.