# 44.8.PL/Tcl中的错误处理
PL/Tcl函数中的Tcl代码或从PL/Tcl函数调用的Tcl代码可能会引发错误,这可能是因为执行了一些无效的操作,也可能是因为使用Tcl函数生成了错误错误
命令或PL/Tcl的埃洛格
命令可以使用Tcl在Tcl中捕获此类错误接住
命令如果错误未被捕获,但允许传播到PL/Tcl函数的最高执行级别,则在函数的调用查询中将其报告为SQL错误。
相反,PL/Tcl中发生的SQL错误高级执行官
,准备好了吗
和spi_execp
命令被报告为Tcl错误,因此Tcl的接住
命令(这些PL/Tcl命令中的每一个都在子事务中运行其SQL操作,该子事务在出错时回滚,以便自动清除任何部分完成的操作。)同样,如果一个错误传播到顶层而没有被捕获,它将返回到一个SQL错误。
Tcl提供了一个错误代码
变量,它可以以Tcl程序易于解释的形式表示有关错误的附加信息。内容采用Tcl列表格式,第一个单词表示报告错误的子系统或库;除此之外,内容将留给单个子系统或库。对于PL/Tcl命令报告的数据库错误,第一个词是博士后
,第二个单词是PostgreSQL版本号,其他单词是字段名/值对,提供有关错误的详细信息。领域SQLSTATE
, 条件
和消息
始终提供(前两个代表错误代码和条件名称,如中所示)附录A).可能存在的字段包括细节
, 暗示
, 上下文
, 模式
, 桌子
, 柱
, 数据类型
, 限制
, 陈述
, 光标位置
, 文件名
, 莱恩诺
和函数名
.
使用PL/Tcl的便捷方式错误代码
信息是将其加载到数组中,以便字段名成为数组下标。这样做的代码可能看起来像
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
}
}
}
(双冒号明确指定错误代码
是一个全局变量。)