支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6

42.8. PL/Tcl 中的錯誤處理 #

PL/Tcl 函數內或從中呼叫的 Tcl 程式碼可能會引發錯誤,無論是透過執行某些無效的操作,還是使用 Tcl error 命令或 PL/Tcl 的 elog 命令來產生錯誤。 可以使用 Tcl catch 命令在 Tcl 中捕獲這些錯誤。 如果未捕獲錯誤,而是允許其傳播到 PL/Tcl 函數執行的最上層,則會將其回報為函數呼叫查詢中的 SQL 錯誤。

相反地,PL/Tcl 的 spi_execspi_preparespi_execp 命令中發生的 SQL 錯誤會回報為 Tcl 錯誤,因此它們可以被 Tcl 的 catch 命令捕獲。(這些 PL/Tcl 命令中的每一個都在子交易中執行其 SQL 操作,該子交易會在發生錯誤時回滾,因此任何部分完成的操作都會自動清除。)同樣地,如果錯誤在未被捕獲的情況下傳播到最上層,它會變回 SQL 錯誤。

Tcl 提供一個 errorCode 變數,該變數可以用一種 Tcl 程式易於解釋的形式來表示有關錯誤的其他資訊。 內容採用 Tcl 清單格式,第一個字會識別回報錯誤的子系統或程式庫;除此之外,內容由個別子系統或程式庫決定。 對於 PL/Tcl 命令回報的資料庫錯誤,第一個字是 POSTGRES,第二個字是 PostgreSQL 版本號碼,其他字是欄位名稱/值配對,提供有關錯誤的詳細資訊。 始終提供欄位 SQLSTATEconditionmessage(前兩個欄位表示錯誤代碼和條件名稱,如 附錄 A 中所示)。 可能存在的欄位包括 detailhintcontextschematablecolumndatatypeconstraintstatementcursor_positionfilenamelinenofuncname

使用 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 是一個全域變數。)

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。