他のバージョンの文書11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

42.8. PL/Tclのエラー処理

PL/Tcl関数中の、あるいはPL/Tcl関数から呼ばれるTclコードは、無効な演算の実行により、あるいはTclのerrorコマンドやPL/Tclのelogコマンドを使ってエラーを生成することにより、エラーとなることがありえます。 これらエラーはTclのcatchコマンドを使ってTcl内で捕捉することができます。 これらエラーは、捕捉されず、PL/Tcl関数実行のトップレベルに伝播することが許容されているなら、データベースエラーに転化します。

逆に、PL/Tclのspi_execspi_preparespi_execpコマンドの中で起きるデータベースエラーは、Tclのエラーとして報告され、したがって、これらはTclのcatchコマンドにより捕捉可能です。 ここでも同様に、捕捉されることなくトップレベルに伝播するならデータベースエラーに戻ります。

Tclは、Tclプログラムで解釈しやすい形式でエラーに関する追加情報を表現できるerrorCode変数を提供します。 変数の中身はTclリスト形式で、1番目の語でエラーを報告したサブシステムまたはライブラリを識別します。それ以降の内容は個々のサブシステムやライブラリに任されています。 PL/Tclコマンドで報告されるデータベースエラーむけには、1番目の語がPOSTGRES、2番目の語がPostgresのバージョン番号で、それ続く語はエラーの詳細情報を提供するフィールド名と値の組です。 フィールドSQLSTATEcondition、およびmessageは常に与えられます(最初の2つは付録A PostgreSQLエラーコードにあるエラーコードと状態名です)。 出現しうるフィールドとしては、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"} {
            # deal with missing table
        } else {
            # deal with some other type of SQL error
        }
    }
}

(二重コロンはerrorCodeがグローバル変数であることを明示的に指定します。)