选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6
历史版本PostgreSQL 9.6 已于 2021 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本

42.8. PL/Tcl 中的错误处理 #

PL/Tcl 函数内的 Tcl 代码,或从 PL/Tcl 函数调用的 Tcl 代码,都可能引发错误:要么是执行了某个非法操作,要么是通过 Tcl 的error命令或 PL/Tcl 的elog命令主动生成错误。在 Tcl 中,可以使用catch命令捕获这类错误。如果错误没有被捕获,而是一路传播到 PL/Tcl 函数执行的顶层,它们会转变为数据库错误。

反过来,在 PL/Tcl 的spi_execspi_preparespi_execp命令中发生的数据库错误会作为 Tcl 错误报告,因此也可以被 Tcl 的catch命令捕获。同样地,如果这些错误在未被捕获的情况下传播到顶层,它们又会重新变回数据库错误。

Tcl 提供了一个errorCode变量,它以便于 Tcl 程序解释的形式携带关于错误的附加信息。该变量的内容采用 Tcl 列表格式,第一个词标识报告该错误的子系统或库;其后的内容则由相应子系统或库自行定义。对于由 PL/Tcl 命令报告的数据库错误,第一个词是POSTGRES,第二个词是 PostgreSQL 版本号,后续内容则是字段名/字段值对,用来提供关于该错误的详细信息。字段SQLSTATEconditionmessage总是会提供(前两个分别对应附录 A中所示的错误代码和条件名称)。可能出现的字段包括 detailhintcontextschematablecolumndatatypeconstraintstatementcursor_positionfilenamelineno以及 funcname

处理 PL/Tcl 的errorCode信息时,一种方便的办法是把它载入数组中,这样字段名就变成了数组下标。对应的代码可能如下所示:

if {[catch { spi_exec $sql_command }]} {
    if {[lindex $::errorCode 0] == "POSTGRES"} {
        array set errorArray $::errorCode
        if {$errorArray(condition) == "undefined_table"} {
            # 处理表不存在的情况
        } else {
            # 处理其他类型的 SQL 错误
        }
    }
}

(双冒号显式指定errorCode是一个全局变量。)

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。