On this page
43.8. PL/Tcl 中的错误处理
通过执行一些无效的操作或使用 Tcl error
命令或 PL/Tcl 的elog
命令生成错误,PL/Tcl 函数中或从 PL/Tcl 函数中调用的 Tcl 代码可能会引发错误。可以使用 Tcl catch
命令在 Tcl 内捕获此类错误。如果未捕获到错误,但允许其传播到 PL/Tcl 函数的执行的最高级别,则在函数的调用查询中将其报告为 SQL 错误。
相反,在 PL/Tcl 的spi_exec
,spi_prepare
和spi_execp
命令中发生的 SQL 错误被报告为 Tcl 错误,因此 Tcl 的catch
命令可以捕获它们。 (这些 PL/Tcl 命令中的每个命令都在子事务中运行其 SQL 操作,该操作会在错误时回滚,以便自动清除任何部分完成的操作.)同样,如果错误传播到顶层而又未被捕获, ,它又变成了 SQL 错误。
Tcl 提供了一个errorCode
变量,该变量可以以易于 Tcl 程序解释的形式表示有关错误的其他信息。内容采用 Tcl 列表格式,第一个单词标识报告错误的子系统或库。除此之外,内容留给各个子系统或库。对于 PL/Tcl 命令报告的数据库错误,第一个单词是POSTGRES
,第二个单词是 PostgreSQL 版本号,其他单词是字段名称/值对,提供有关错误的详细信息。始终提供字段SQLSTATE
,condition
和message
(前两个代表错误代码和条件名称,如Appendix A所示)。可能出现的字段包括detail
,hint
,context
,schema
,table
,column
,datatype
,constraint
,statement
,cursor_position
,filename
,lineno
和funcname
。
使用 PL/Tcl 的errorCode
信息的一种便捷方法是将其加载到数组中,以便字段名称成为数组下标。这样做的代码可能看起来像
if {[catch { spi_exec $sql_command }]} {
if {[lindex $::errorCode 0] == "POSTGRES"} {
array set errorArray $::errorCode
if {$errorArray(condition) == "undefined_table"} {
# deal with missing table
} else {
# deal with some other type of SQL error
}
}
}
(双冒号明确指定errorCode
是全局变量.)