43.8. ÐбÑабоÑка оÑибок в PL/Tcl #
Tcl-код, ÑодеÑжаÑийÑÑ Ð¸Ð»Ð¸ вÑзÑваемÑй из ÑÑнкÑии PL/Tcl, Ð¼Ð¾Ð¶ÐµÑ Ð²ÑдаваÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð»Ð¸Ð±Ð¾ вÑполнÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑÑÑимÑÑ Ð¾Ð¿ÐµÑаÑиÑ, либо генеÑиÑÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ error ÑзÑка Tcl или ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ elog ÑзÑка PL/Tcl. Такие оÑибки могÑÑ Ð±ÑÑÑ Ð¿ÐµÑеÑ
ваÑÐµÐ½Ñ Ð² ÑÑеде Tcl Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Tcl catch. ÐÑли оÑибка не пеÑеÑ
ваÑÑваеÑÑÑ, а ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð²ÑÑе ÑÑÐ¾Ð²Ð½Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑнкÑий PL/Tcl, она пеÑедаÑÑÑÑ Ð² запÑоÑ, вÑзвавÑий ÑÑнкÑиÑ, как оÑибка SQL.
РнапÑоÑив, оÑибки СУÐÐ, возникаÑÑие внÑÑÑи команд spi_exec, spi_prepare и spi_execp в ÑÑеде PL/Tcl, вÑдаÑÑÑÑ ÐºÐ°Ðº оÑибки Tcl, Ñак ÑÑо иÑ
можно пеÑеÑ
ваÑиÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ Tcl catch. (ÐÐ°Ð¶Ð´Ð°Ñ Ð¸Ð· ÑÑиÑ
команд PL/Tcl вÑполнÑÐµÑ SQL-опеÑаÑÐ¸Ñ Ð² подÑÑанзакÑии, коÑоÑÐ°Ñ Ð¾ÑкаÑÑваеÑÑÑ Ð² ÑлÑÑае оÑибки, Ñак ÑÑо Ð´Ð»Ñ ÑаÑÑиÑно завеÑÑÑннÑÑ
опеÑаÑий пÑоизводиÑÑÑ Ð°Ð²ÑомаÑиÑеÑÐºÐ°Ñ Ð¾ÑиÑÑка.) ÐпÑÑÑ Ð¶Ðµ, еÑли оÑибка не пеÑеÑ
ваÑÑваеÑÑÑ Ð¸ ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð²ÑÑе веÑÑ
него ÑÑовнÑ, она ÑÑановиÑÑÑ Ð¾Ñибкой SQL.
Ð Tcl имееÑÑÑ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ errorCode, пÑедÑÑавлÑÑÑÐ°Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± оÑибке в виде, Ñдобном Ð´Ð»Ñ Ð¾Ð±ÑабоÑки в пÑогÑаммаÑ
на Tcl. ÐÑа инÑоÑмаÑÐ¸Ñ Ð¿ÐµÑедаÑÑÑÑ Ð² ÑоÑмаÑе ÑпиÑка Tcl, пеÑвое Ñлово в коÑоÑом ÑказÑÐ²Ð°ÐµÑ Ð½Ð° подÑиÑÑÐµÐ¼Ñ Ð¸Ð»Ð¸ библиоÑекÑ, вÑдаÑÑÑÑ Ð¾ÑибкÑ; поÑледÑÑÑее ÑодеÑжимое опÑеделÑеÑÑÑ Ð² завиÑимоÑÑи Ð¾Ñ Ð¿Ð¾Ð´ÑиÑÑÐµÐ¼Ñ Ð¸Ð»Ð¸ библиоÑеки. ÐÐ»Ñ Ð¾Ñибок СУÐÐ, возникаÑÑиÑ
в командаÑ
PL/Tcl, пеÑвÑм Ñловом бÑÐ´ÐµÑ POSTGRES, вÑоÑÑм â Ð½Ð¾Ð¼ÐµÑ Ð²ÐµÑÑии Postgres Pro, а дополниÑелÑнÑе Ñлова пÑедÑÑавлÑÑÑ Ð¿Ð°ÑÑ Ð¸Ð¼Ñ/знаÑениÑ, пеÑедаÑÑие подÑобнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± оÑибке. Ð ÑÑиÑ
паÑаÑ
вÑегда пеÑедаÑÑÑÑ Ð¿Ð¾Ð»Ñ SQLSTATE, condition и message (пеÑвÑе два пÑедÑÑавлÑÑÑ ÐºÐ¾Ð´ оÑибки и Ð¸Ð¼Ñ ÑÑловиÑ, как опиÑано в ÐÑиложении A). Также могÑÑ Ð¿ÐµÑедаваÑÑÑÑ Ð¿Ð¾Ð»Ñ detail, hint, context, schema, table, column, datatype, constraint, statement, cursor_position, filename, lineno и funcname.
С инÑоÑмаÑией в пеÑеменной errorCode ÑÑÐµÐ´Ñ PL/Tcl Ñдобно ÑабоÑаÑÑ, загÑÑзив пеÑеменнÑÑ Ð² маÑÑив, ÑÑÐ¾Ð±Ñ Ð¸Ð¼ÐµÐ½Ð° полей ÑÑали индекÑами в маÑÑиве. ÐÑÐ¸Ð¼ÐµÑ Ñакого кода:
if {[catch { spi_exec $sql_command }]} {
if {[lindex $::errorCode 0] == "POSTGRES"} {
array set errorArray $::errorCode
if {$errorArray(condition) == "undefined_table"} {
# ÑазобÑаÑÑÑÑ Ñ Ð¾ÑÑÑÑÑÑвием ÑаблиÑÑ
} else {
# ÑазобÑаÑÑÑÑ Ñ Ð´ÑÑгими Ñипами оÑибок SQL
}
}
} (ÐвойнÑе двоеÑоÑÐ¸Ñ Ñвно ÑказÑваÑÑ, ÑÑо пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ errorCode ÑвлÑеÑÑÑ Ð³Ð»Ð¾Ð±Ð°Ð»Ñной.)