สร้างข้อยกเว้นด้วยบริบท


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');
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.