37.9. 错误和消息

利用RAISE语句报告信息以及抛出错误。

RAISE level 'format' [, variable [, ...]];

可能的级别有DEBUG(向服务器日志写信息), LOG(向服务器日志写信息,优先级更高), INFONOTICEWARNING(把信息写到 服务器日志以及转发到客户端应用,优先级逐步升高)和 EXCEPTION(抛出一个错误, 退出当前事务). 某个优先级别的信息是报告给客户端还是写到服务器日志, 还是两个都做是由 log_min_messagesclient_min_messages 配置变量控制的。 参阅 Section 16.4 获取更多细节。

在格式字串里,% 被下一个可选参数的外部表现形式代替。 要发出一个文本的 %,你要写 %%。 请注意可选的参数必须是简单的变量,不能是表达式,而且格式必须是一个简单的字串文本。

在这个例子里,v_job_id的值将代替字串中的%

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

这个例子将会带着给出的错误信息退出事务:

RAISE EXCEPTION ''Inexistent ID --> %'',user_id;

PostgreSQL 现在还没有足够聪明的例外处理模型。 不管是分析器,规划器/优化器还是执行器认为一条语句无法再处理下去了, 那么整个事务都退出,然后系统跳回主循环等待来自客户端应用的下一条命令。

我们可以'钩'在错误处理机制上来提示这种情况的发生。 但是目前我们没有能力告诉(用户)是什么导致了退出(输入/输出转换错误, 浮点数错误,分析错误等)。并且此时的数据库服务器可能处在一种不连贯的状态, 所以退回到上层执行器或执行更多的命令可能摧毁整个数据库。

因此,PL/pgSQL 在函数或触发器操作时遇到退出的唯一一项操作是写一些额外的NOTICE级别的日志信息, 报告在哪个函数和在那里(行号和语句类型)出了错。 这些错误总是中止该函数的执行。