Le code Tcl contenu ou appelé à partir d'une fonction PL/Tcl peut lever une erreur, soit en exécutant des opérations invalides ou en générant une erreur en utilisant la commande Tcl error ou la commande PL/Tcl elog. De tels erreurs sont récupérables dans Tcl en utilisant la commande Tcl catch. Si elles ne sont pas récupérées et si elles sont autorisées à se propager au niveau supérieur d'exécution de la fonction PL/Tcl, elles se transforment en erreur au niveau du serveur de bases de données.
Les erreurs au niveau base survenant dans les commandes PL/Tcl spi_exec, spi_prepare et spi_execp sont rapportées comme des erreurs Tcl, donc elles sont récupérables par la commande Tcl catch. De nouveau, si elles se propagent au niveau supérieur sans être récupérées, elles se transforment en erreurs au niveau base.
Tcl fournit une variable errorCode pouvant représenter des informations supplémentaires sur une erreur dans un format qui est simple à interpréter pour les programmes Tcl. Le contenu est dans le format liste Tcl, et le premier mot identifie le sous-système ou la bibliothèque rapportant l'errer ; au delà, le contenu est laissé au sous-système individuel ou à la bibliothèque. Pour les erreurs au niveau base rapportées par les commandes PL/Tcl commands, le premier mot est POSTGRES, le second est le numéro de version du serveur, et les mots supplémentaires sont les paires nom/valeur des champs fournissant des informations détaillées sur l'erreur. Les champs SQLSTATE, condition et message sont toujours fournies (les deux premiers représentent le code d'erreur et le nom de la condition comme indiqués dans Annexe A, Codes d'erreurs de PostgreSQL™). Les champs potentiellement présents incluent detail, hint, context, schema, table, column, datatype, constraint, statement, cursor_position, filename, lineno et funcname.
Une façon agréable de travailler avec l'information errorCode de PL/Tcl est de la charger dans un tableau pour que les noms du champ deviennent des indices du tableau. Un code relatif ressemblerait à ceci :
if {[catch { spi_exec $sql_command }]} { if {[lindex $::errorCode 0] == "POSTGRES"} { array set errorArray $::errorCode if {$errorArray(condition) == "undefined_table"} { # gestion de la table manquante } else { # gestion des autres types d'erreur SQL } } }
(Les symboles deux-points spécifient explicitement que errorCode est une variable globale.)