# 43.9.错误和消息

43.9.1. 报告错误和消息

43.9.2. 检查断言

# 43.9.1.报告错误和消息

使用提升语句来报告消息并引发错误。

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 ;

这个*数量*选项指定错误的严重性。允许的水平是调试,日志,信息,注意,警告例外具有例外作为默认值。例外引发错误(通常会中止当前事务);其他级别只生成不同优先级的消息。特定优先级的消息是报告给客户端、写入服务器日志,还是两者都由日志_最小值✓哦♫消息客户✓哦♫最小值✓哦♫消息可变配置。参见第20章更多信息。

之后*级别如果有的话,你可以写一个格式*(必须是简单的字符串文本,而不是表达式)。格式字符串指定要报告的错误消息文本。格式字符串后面可以是插入消息中的可选参数表达式。在格式字符串中,百分比%替换为下一个可选参数值的字符串表示形式。写百分比%发出文字百分比%。参数的数目必须与百分比%格式字符串中的占位符,或者在编译函数时引发错误。

在本例中,V作业ID将替换%在字符串中:

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

您可以通过书写将附加信息附加到错误报告中使用然后*选项* = *表示项目。每个表示可以是任何字符串值表达式。允许的选项*关键词是:

消息

设置错误消息文本。此选项不能以提升之前包含一个格式字符串使用.

细节

提供错误详细信息。

暗示

提供提示信息。

错误代码

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


限制
数据类型
桌子
模式

提供相关对象的名称。

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

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';

还有第二个提升主参数是要报告的条件名称或SQLSTATE的语法,例如:

RAISE division_by_zero;
RAISE SQLSTATE '22012';

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

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

还有一种变体是写作利用提高*数量*使用把其他的都放进使用列表

最后一个变种提升完全没有参数。此表格只能在开始布洛克例外条款它会导致重新抛出当前正在处理的错误。

# 笔记

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

如果在引发异常命令,默认为使用ERRCODE_RAISE_异常 (P0001)。如果未指定消息文本,则默认情况下使用条件名称或SQLSTATE作为消息文本。

# 笔记

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

# 43.9.2.检查断言

这个明确肯定语句是在PL/pgSQL函数中插入调试检查的一种方便快捷的方法。

ASSERT condition [ , message ];

这个*条件是一个布尔表达式,其计算结果应始终为true;如果是这样的话明确肯定声明没有进一步的作用。如果结果为false或null,则断言失败提出了例外情况。(如果评估过程中出现错误条件*,报告为正常错误。)

如果可选*消息如果条件失败这个消息*在断言成功的正常情况下,不计算表达式。

可以通过配置参数启用或禁用断言测试plpgsql。查核财产,它接受一个布尔值;默认值是在…上.如果此参数为然后明确肯定声明没有任何作用。

注意明确肯定用于检测程序错误,而不是报告普通错误情况。使用提升声明,如上所述。