2024 年 9 月 26 日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2

41.9. 错误和消息 #

41.9.1. 报告错误和消息 #

使用 RAISE 语句报告消息和引发错误。

RAISE [ level ] 'format' [, expression [, ... ]] [ USING option = expression [, ... ] ];
RAISE [ level ] condition_name [ USING option = expression [, ... ] ];
RAISE [ level ] SQLSTATE 'sqlstate' [ USING option = expression [, ... ] ];
RAISE [ level ] USING option = expression [, ... ];
RAISE ;

The level 选项指定错误严重级别。允许的级别是 DEBUGLOGINFONOTICEWARNINGEXCEPTION,其中 EXCEPTION 是默认值。 EXCEPTION 会引发错误(通常会中止当前事务);其他级别只会生成不同优先级的消息。特定优先级消息是否报告给客户端、写入服务器日志或两者兼而有之,由 log_min_messagesclient_min_messages 配置变量控制。有关更多信息,请参见 第 19 章

level 之后,如果存在,您可以指定一个 format 字符串(它必须是一个简单的字符串字面量,而不是表达式)。格式字符串指定要报告的错误消息文本。格式字符串之后可以跟可选参数表达式,以插入到消息中。在格式字符串中,% 将被替换为下一个可选参数值的字符串表示形式。编写 %% 以发出文字 %。参数的数量必须与格式字符串中 % 占位符的数量匹配,否则在编译函数时会引发错误。

在此示例中,v_job_id 的值将替换字符串中的 %

RAISE NOTICE 'Calling cs_create_job(%)', v_job_id;

您可以通过编写 USING 后跟 option = expression 项将附加信息附加到错误报告。每个 expression 可以是任何字符串值表达式。允许的 option 关键字是

MESSAGE #

设置错误消息文本。此选项不能在包含 USING 之前格式字符串的 RAISE 形式中使用。

DETAIL #

提供错误详细信息消息。

HINT #

提供提示消息。

ERRCODE #

指定要报告的错误代码(SQLSTATE),可以通过条件名称(如 附录 A 中所示)或直接作为五字符 SQLSTATE 代码指定。

COLUMN
CONSTRAINT
DATATYPE
TABLE
SCHEMA #

提供相关对象的名称。

此示例将使用给定的错误消息和提示中止事务

RAISE EXCEPTION 'Nonexistent ID --> %', user_id
      USING HINT = 'Please check your user ID';

这两个示例显示了设置 SQLSTATE 的等效方法

RAISE 'Duplicate user ID: %', user_id USING ERRCODE = 'unique_violation';
RAISE 'Duplicate user ID: %', user_id USING ERRCODE = '23505';

有一个第二种 RAISE 语法,其中主要参数是要报告的条件名称或 SQLSTATE,例如

RAISE division_by_zero;
RAISE SQLSTATE '22012';

在此语法中,可以使用 USING 提供自定义错误消息、详细信息或提示。另一种执行之前示例的方法是

RAISE unique_violation USING MESSAGE = 'Duplicate user ID: ' || user_id;

另一个变体是编写 RAISE USINGRAISE level USING 并将所有其他内容放入 USING 列表中。

最后一个 RAISE 变体根本没有参数。此形式只能在 BEGIN 块的 EXCEPTION 子句中使用;它会导致当前正在处理的错误被重新抛出。

注意

PostgreSQL 9.1 之前,没有参数的 RAISE 被解释为重新抛出包含活动异常处理程序的块中的错误。因此,嵌套在该处理程序内的 EXCEPTION 子句无法捕获它,即使 RAISE 位于嵌套的 EXCEPTION 子句的块中。这被认为是令人惊讶的,并且与 Oracle 的 PL/SQL 不兼容。

如果在 RAISE EXCEPTION 命令中没有指定条件名称或 SQLSTATE,则默认使用 raise_exception (P0001)。如果没有指定消息文本,则默认使用条件名称或 SQLSTATE 作为消息文本。

注意

通过 SQLSTATE 代码指定错误代码时,您并不局限于预定义的错误代码,而是可以选择任何由五个数字和/或大写 ASCII 字母组成的错误代码,除了 00000。建议您避免抛出以三个零结尾的错误代码,因为这些是类别代码,只能通过捕获整个类别来捕获。

41.9.2. 检查断言 #

The ASSERT 语句是将调试检查插入 PL/pgSQL 函数的便捷简写。

ASSERT condition [ , message ];

The condition 是一个布尔表达式,预计始终计算为真;如果确实如此,则 ASSERT 语句不会执行任何其他操作。如果结果为假或空,则会引发 ASSERT_FAILURE 异常。(如果在计算 condition 时出现错误,则会报告为正常错误。)

如果提供了可选的 message,则它是一个表达式,其结果(如果非空)将替换默认错误消息文本 断言失败,如果 condition 失败。在断言成功的情况下,不会计算 message 表达式。

可以通过配置参数 plpgsql.check_asserts 对断言进行测试,该参数采用布尔值;默认值为 on。如果此参数为 off,则 ASSERT 语句将不执行任何操作。

请注意,ASSERT 用于检测程序错误,而不是用于报告普通错误条件。使用上面描述的 RAISE 语句来实现这一点。

提交更正

如果您在文档中发现任何不正确的内容、与您对特定功能的体验不符或需要进一步说明,请使用 此表格 报告文档问题。