51.2. ÐÑвод ÑообÑений об оÑÐ¸Ð±ÐºÐ°Ñ Ð² коде ÑеÑвеÑа
СообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибкаÑ
, пÑедÑпÑÐµÐ¶Ð´ÐµÐ½Ð¸Ñ Ð¸ обÑÑнÑе ÑообÑениÑ, вÑдаваемÑе в коде ÑеÑвеÑа Ð´Ð¾Ð»Ð¶Ð½Ñ ÑоздаваÑÑÑÑ ÑÑнкÑией ereport или ÑодÑÑвенной ÐµÑ Ð¿ÑедÑеÑÑвенниÑей elog. ÐÑполÑзование ÑÑой ÑÑнкÑии доÑÑаÑоÑно Ñложно и ÑÑебÑÐµÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑного обÑÑÑнениÑ.
У каждого ÑообÑÐµÐ½Ð¸Ñ ÐµÑÑÑ Ð´Ð²Ð° обÑзаÑелÑнÑÑ
ÑлеменÑа: ÑÑÐ¾Ð²ÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ð¾ÑÑи (Ð¾Ñ DEBUG до PANIC) и оÑновной ÑекÑÑ ÑообÑениÑ. Рдополнение к ним еÑÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑе ÑлеменÑÑ, из коÑоÑÑÑ
ÑаÑÑо иÑполÑзÑеÑÑÑ ÐºÐ¾Ð´ иденÑиÑикаÑоÑа оÑибки, ÑооÑвеÑÑÑвÑÑÑий опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ SQLSTATE в ÑпеÑиÑикаÑии SQL. ФÑнкÑÐ¸Ñ ereport Ñама по Ñебе ÑвлÑеÑÑÑ Ð¿ÑоÑÑо оболоÑкой, коÑоÑÐ°Ñ ÑÑÑеÑÑвÑÐµÑ Ð² оÑновном Ð´Ð»Ñ ÑинÑакÑиÑеÑкого ÑдобÑÑва, ÑÑÐ¾Ð±Ñ Ð²ÑдаÑа ÑообÑÐµÐ½Ð¸Ñ Ð²ÑглÑдела как вÑзов ÑÑнкÑии в коде C. ÐдинÑÑвеннÑй паÑамеÑÑ, коÑоÑÑй пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно ÑÑнкÑÐ¸Ñ ereport, ÑÑо ÑÑÐ¾Ð²ÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ð¾ÑÑи. ÐÑновной ÑекÑÑ Ð¸ лÑбÑе дополниÑелÑнÑе ÑлеменÑÑ ÑообÑÐµÐ½Ð¸Ñ Ð³ÐµÐ½ÐµÑиÑÑÑÑÑÑ Ð² ÑезÑлÑÑаÑе вÑзова вÑпомогаÑелÑнÑÑ
ÑÑнкÑий, ÑакиÑ
как errmsg, в вÑзове ereport.
ТипиÑнÑй вÑзов ereport вÑглÑÐ´Ð¸Ñ Ð¿ÑимеÑно Ñак:
ereport(ERROR,
(errcode(ERRCODE_DIVISION_BY_ZERO),
errmsg("division by zero"))); РнÑм задаÑÑÑÑ ÑÑÐ¾Ð²ÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ð¾ÑÑи ERROR (заÑÑÑÐ´Ð½Ð°Ñ Ð¾Ñибка). РвÑзове errcode ÑказÑваеÑÑÑ ÐºÐ¾Ð´ оÑибки SQLSTATE по макÑоÑÑ, опÑеделÑÐ½Ð½Ð¾Ð¼Ñ Ð² src/include/utils/errcodes.h. ÐÑзов errmsg даÑÑ ÑекÑÑ Ð¾Ñновного ÑообÑениÑ. ÐбÑаÑиÑе внимание на дополниÑелÑнÑй Ð½Ð°Ð±Ð¾Ñ Ñкобок, окÑÑжаÑÑиÑ
вÑÐ·Ð¾Ð²Ñ Ð²ÑпомогаÑелÑнÑÑ
ÑÑнкÑий â они загÑомождаÑÑ ÐºÐ¾Ð´, но ÑÑебÑÑÑÑÑ ÑинÑакÑиÑом.
Ðолее ÑложнÑй пÑимеÑ:
ereport(ERROR,
(errcode(ERRCODE_AMBIGUOUS_FUNCTION),
errmsg("function %s is not unique",
func_signature_string(funcname, nargs,
NIL, actual_arg_types)),
errhint("Unable to choose a best candidate function. "
"You might need to add explicit typecasts.")));РнÑм демонÑÑÑиÑÑеÑÑÑ Ð¸ÑполÑзование кодов ÑоÑмаÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñений вÑемени вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð² ÑекÑÑ ÑообÑениÑ. Также в нÑм добавлÑеÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑное ÑообÑение «подÑказки».
ÐÑи ÑÑовне важноÑÑи ERROR или более вÑÑоком, ereport пÑеÑÑÐ²Ð°ÐµÑ Ð²Ñполнение полÑзоваÑелÑÑкой ÑÑнкÑии и не возвÑаÑÐ°ÐµÑ ÑпÑавление в вÑзÑваÑÑий код. ÐÑли ÑÑÐ¾Ð²ÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ð¾ÑÑи ниже ERROR, ereport завеÑÑаеÑÑÑ Ð¾Ð±ÑÑнÑм ÑпоÑобом.
ÐÐ»Ñ ereport пÑедлагаÑÑÑÑ ÑледÑÑÑие вÑпомогаÑелÑнÑе ÑÑнкÑии:
errcode(sqlerrcode)задаÑÑ ÐºÐ¾Ð´ иденÑиÑикаÑоÑа оÑибки SQLSTATE Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ оÑибки. ÐÑли ÑÑа ÑÑнкÑÐ¸Ñ Ð½Ðµ вÑзÑваеÑÑÑ, подÑазÑмеваеÑÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ Ð¾ÑибкиERRCODE_INTERNAL_ERRORпÑи ÑÑовне важноÑÑиERRORили вÑÑе, либоERRCODE_WARNINGпÑи ÑÑовне важноÑÑиWARNING, инаÑе (пÑи ÑÑовнеNOTICEили ниже) âERRCODE_SUCCESSFUL_COMPLETION. ХоÑÑ ÑÑи знаÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð¾Ð²Ð¾Ð»Ñно ÑазÑмнÑ, вÑегда ÑÑÐ¾Ð¸Ñ Ð¿Ð¾Ð´ÑмаÑÑ, наÑколÑко они ÑмеÑÑнÑ, пÑежде Ñем опÑÑÑиÑÑ Ð²Ñзовerrcode().errmsg(const char *msg, ...)задаÑÑ Ð¾Ñновной ÑекÑÑ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке и, возможно, знаÑÐµÐ½Ð¸Ñ Ð²Ñемени вÑполнениÑ, коÑоÑÑе бÑдÑÑ Ð² него вклÑÑаÑÑÑÑ. ÐÑи вклÑÑÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑÑваÑÑÑÑ ÐºÐ¾Ð´Ð°Ð¼Ð¸ ÑоÑмаÑа в ÑÑилеsprintf. Рдополнение к ÑÑандаÑÑнÑм кодам ÑоÑмаÑа, пÑинимаемÑм ÑÑнкÑиейsprintf, можно иÑполÑзоваÑÑ ÐºÐ¾Ð´ ÑоÑмаÑа%m, коÑоÑÑй вÑÑÐ°Ð²Ð¸Ñ ÑообÑение об оÑибке, возвÑаÑÑнное ÑÑÑокойstrerrorÐ´Ð»Ñ ÑекÑÑего знаÑениÑerrno. [13] ÐлÑ%mне ÑÑебÑеÑÑÑ ÑооÑвеÑÑÑвÑÑÑÐ°Ñ Ð·Ð°Ð¿Ð¸ÑÑ Ð² ÑпиÑке паÑамеÑÑовerrmsg. ÐамеÑÑÑе, ÑÑо ÑÑа ÑÑÑока бÑÐ´ÐµÑ Ð¿ÑопÑÑена ÑеÑезgettext, Ñо еÑÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ð¾ÐºÐ°Ð»Ð¸Ð·Ð¾Ð²Ð°Ð½Ð°, до обÑабоÑки кодов ÑоÑмаÑа.errmsg_internal(const char *msg, ...)дейÑÑвÑÐµÑ ÐºÐ°Ðºerrmsg, но ÐµÑ ÑÑÑока ÑообÑÐµÐ½Ð¸Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð¿ÐµÑеводиÑÑÑÑ Ð¸ вклÑÑаÑÑÑÑ Ð² ÑловаÑÑ ÑообÑений Ð´Ð»Ñ Ð¸Ð½ÑеÑнаÑионализаÑии. ÐÑо ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð´Ð»Ñ ÑлÑÑаев, коÑоÑÑе «не пÑоиÑÑ Ð¾Ð´ÑÑ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð°Â», Ñак ÑÑо ÑÑаÑиÑÑ ÑÐ¸Ð»Ñ Ð½Ð° Ð¸Ñ Ð¿ÐµÑевод не ÑÑоиÑ.errmsg_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n, ...)дейÑÑвÑÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾errmsg, но поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑазлиÑнÑе ÑоÑÐ¼Ñ ÑообÑÐµÐ½Ð¸Ñ Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвеннÑми ÑиÑлами. ÐаÑамеÑÑfmt_singularзадаÑÑ ÑÑÑÐ¾ÐºÑ ÑоÑмаÑа на английÑком Ð´Ð»Ñ ÐµÐ´Ð¸Ð½ÑÑвенного ÑиÑла,fmt_pluralâ ÑоÑÐ¼Ð°Ñ Ð´Ð»Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвенного ÑиÑла,nзадаÑÑ Ñелое ÑиÑло, опÑеделÑÑÑее, ÐºÐ°ÐºÐ°Ñ Ð¸Ð¼ÐµÐ½Ð½Ð¾ ÑоÑма множеÑÑвенного ÑиÑла ÑÑебÑеÑÑÑ, а оÑÑалÑнÑе аÑгÑменÑÑ ÑоÑмаÑиÑÑÑÑÑÑ ÑоглаÑно вÑбÑанной ÑÑÑоке ÑоÑмаÑа. Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 52.2.2.errdetail(const char *msg, ...)задаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑное «подÑобное» ÑообÑение; оно должно иÑполÑзоваÑÑÑÑ, когда еÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑÐ½Ð°Ñ Ð¸Ð½ÑоÑмаÑиÑ, коÑоÑÑÑ Ð½ÐµÑмеÑÑно вклÑÑаÑÑ Ð² оÑновное ÑообÑение. СÑÑока ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑабаÑÑваеÑÑÑ Ñак же, как и длÑerrmsg.errdetail_internal(const char *msg, ...)дейÑÑвÑÐµÑ ÐºÐ°Ðºerrdetail, но ÐµÑ ÑÑÑока ÑообÑÐµÐ½Ð¸Ñ Ð½Ðµ бÑÐ´ÐµÑ Ð¿ÐµÑеводиÑÑÑÑ Ð¸ вклÑÑаÑÑÑÑ Ð² ÑловаÑÑ ÑообÑений Ð´Ð»Ñ Ð¸Ð½ÑеÑнаÑионализаÑии. ÐÑо ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð´ÑобнÑÑ ÑообÑений, на пеÑевод коÑоÑÑÑ Ð½Ðµ ÑÑÐ¾Ð¸Ñ ÑÑаÑиÑÑ ÑилÑ, напÑимеÑ, когда ÑÑо ÑÐµÑ Ð½Ð¸ÑеÑÐºÐ°Ñ Ð¸Ð½ÑоÑмаÑиÑ, непонÑÑÐ½Ð°Ñ Ð±Ð¾Ð»ÑÑинÑÑÐ²Ñ Ð¿Ð¾Ð»ÑзоваÑелей.errdetail_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n, ...)дейÑÑвÑÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾errdetail, но поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑазлиÑнÑе ÑоÑÐ¼Ñ ÑообÑÐµÐ½Ð¸Ñ Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвеннÑми ÑиÑлами. Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 52.2.2.errdetail_log(const char *msg, ...)подобнаerrdetail, но вÑÐ²Ð¾Ð´Ð¸Ð¼Ð°Ñ ÑÑÑока Ð¿Ð¾Ð¿Ð°Ð´Ð°ÐµÑ ÑолÑко в жÑÑнал ÑеÑвеÑа, и никогда не пеÑедаÑÑÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ. ÐÑли иÑполÑзÑеÑÑÑ Ð¸errdetail(или один из ÐµÑ ÑквиваленÑов), иerrdetail_log, Ñогда одна ÑÑÑока пеÑедаÑÑÑÑ ÐºÐ»Ð¸ÐµÐ½ÑÑ, а дÑÑÐ³Ð°Ñ Ð¾ÑпÑавлÑеÑÑÑ Ð² жÑÑнал. ÐÑо полезно Ð´Ð»Ñ Ð²Ñвода подÑобнÑÑ ÑообÑений, имеÑÑÐ¸Ñ ÐºÐ¾Ð½ÑиденÑиалÑнÑй Ñ Ð°ÑакÑÐµÑ Ð¸Ð»Ð¸ болÑÑой ÑазмеÑ, Ñак ÑÑо пеÑедаваÑÑ Ð¸Ñ ÐºÐ»Ð¸ÐµÐ½ÑÑ Ð½ÐµÐ¶ÐµÐ»Ð°ÑелÑно.errdetail_log_plural(const char *fmt_singular, const char *fmt_plural, unsigned long n, ...)дейÑÑвÑÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾errdetail_log, но поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑазлиÑнÑе ÑоÑÐ¼Ñ ÑообÑÐµÐ½Ð¸Ñ Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑвеннÑми ÑиÑлами. Ðа дополниÑелÑнÑми ÑведениÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 52.2.2.errhint(const char *msg, ...)пеÑедаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑное ÑообÑение «подÑказки»; ÑÑо позволÑÐµÑ Ð¿ÑедложиÑÑ ÑеÑение пÑоблемÑ, а не пÑоÑÑо ÑообÑиÑÑ ÑакÑÑ, ÑвÑзаннÑе Ñ Ð½ÐµÐ¹. СÑÑока ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑабаÑÑваеÑÑÑ Ñак же, как и длÑerrmsg.errcontext(const char *msg, ...)обÑÑно не вÑзÑваеÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно Ñ Ð¼ÐµÑÑа вÑзоваereport, а иÑполÑзÑеÑÑÑ Ð² ÑÑнкÑиÑÑ Ð¾Ð±ÑаÑного вÑзоваerror_context_stackи вÑдаÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ конÑекÑÑе, в коÑоÑом пÑоизоÑла оÑибка, напÑимеÑ, о ÑекÑÑем положении в ÑÑнкÑии PL. СÑÑока ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑабаÑÑваеÑÑÑ Ñак же, как и длÑerrmsg. РоÑлиÑие Ð¾Ñ Ð´ÑÑÐ³Ð¸Ñ Ð²ÑпомогаÑелÑнÑÑ ÑÑнкÑий, внÑÑÑи вÑзоваereportÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ вÑзÑваÑÑ Ð½ÐµÐ¾Ð´Ð½Ð¾ÐºÑаÑно; добавлÑемÑе Ñаким обÑазом поÑледоваÑелÑнÑе ÑообÑÐµÐ½Ð¸Ñ ÑкладÑваÑÑÑÑ ÑеÑез ÑÐ¸Ð¼Ð²Ð¾Ð»Ñ Ð¿ÐµÑевода ÑÑÑок.errposition(int cursorpos)задаÑÑ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ðµ оÑибки в ÑекÑÑе запÑоÑа. РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÑо полезно ÑолÑко Ð´Ð»Ñ Ð¾Ñибок, вÑÑвлÑемÑÑ Ð½Ð° ÑÑÐ°Ð¿Ð°Ñ Ð»ÐµÐºÑиÑеÑкого и ÑинÑакÑиÑеÑкого анализа запÑоÑа.errtable(Relation rel)опÑеделÑÐµÑ Ð¾ÑноÑение, Ð¸Ð¼Ñ Ð¸ ÑÑ ÐµÐ¼Ð° коÑоÑого Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð²ÐºÐ»ÑÑÐµÐ½Ñ Ð²Ð¾ вÑпомогаÑелÑнÑе Ð¿Ð¾Ð»Ñ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке.errtablecol(Relation rel, int attnum)опÑеделÑÐµÑ ÑÑолбеÑ, Ð¸Ð¼Ñ ÐºÐ¾ÑоÑого, вмеÑÑе Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑаблиÑÑ Ð¸ ÑÑ ÐµÐ¼Ñ, должно бÑÑÑ Ð²ÐºÐ»ÑÑено во вÑпомогаÑелÑнÑе Ð¿Ð¾Ð»Ñ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке.errtableconstraint(Relation rel, const char *conname)задаÑÑ Ð¸Ð¼Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ ÑаблиÑÑ, коÑоÑое вмеÑÑе Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑаблиÑÑ Ð¸ ÑÑ ÐµÐ¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ бÑÑÑ Ð²ÐºÐ»ÑÑено во вÑпомогаÑелÑнÑе Ð¿Ð¾Ð»Ñ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке. Рданном конÑекÑÑе Ð¸Ð½Ð´ÐµÐºÑ ÑÑиÑаеÑÑÑ Ð¾Ð³ÑаниÑением, незавиÑимо Ð¾Ñ Ñого, имееÑÑÑ Ð»Ð¸ Ð´Ð»Ñ Ð½ÐµÐ³Ð¾ запиÑÑ Ð²pg_constraint. ÐамеÑÑÑе, ÑÑо пÑи ÑÑом в каÑеÑÑвеrelнÑжно пеÑедаваÑÑ Ð½Ð¸Ð¶ÐµÐ»ÐµÐ¶Ð°Ñее оÑноÑение, а не Ñам индекÑ.errdatatype(Oid datatypeOid)задаÑÑ Ñип даннÑÑ , Ð¸Ð¼Ñ ÐºÐ¾ÑоÑого, вмеÑÑе Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ ÑÑ ÐµÐ¼Ñ, должно вклÑÑаÑÑÑÑ Ð²Ð¾ вÑпомогаÑелÑнÑе Ð¿Ð¾Ð»Ñ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке.errdomainconstraint(Oid datatypeOid, const char *conname)задаÑÑ Ð¸Ð¼Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¼ÐµÐ½Ð°, коÑоÑое вмеÑÑе Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ домена и ÑÑ ÐµÐ¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ вклÑÑаÑÑÑÑ Ð²Ð¾ вÑпомогаÑелÑнÑе Ð¿Ð¾Ð»Ñ ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке.errcode_for_file_access()â вÑпомогаÑелÑÐ½Ð°Ñ ÑÑнкÑиÑ, вÑбиÑаÑÑÐ°Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑий иденÑиÑикаÑÐ¾Ñ SQLSTATE пÑи Ñбое в ÑиÑÑемном вÑзове, в коÑоÑом пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¾Ð±ÑаÑение к Ñайловой ÑиÑÑеме. Ðакой код оÑибки генеÑиÑоваÑÑ, она опÑеделÑÐµÑ Ð¿Ð¾ ÑÐ¾Ñ ÑанÑÐ½Ð½Ð¾Ð¼Ñ Ð·Ð½Ð°ÑениÑerrno. ÐбÑÑно ÑÑо иÑполÑзÑеÑÑÑ Ð² ÑоÑеÑании Ñ%mв оÑновном ÑообÑении об оÑибке.errcode_for_socket_access()â вÑпомогаÑелÑÐ½Ð°Ñ ÑÑнкÑиÑ, вÑбиÑаÑÑÐ°Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑий иденÑиÑикаÑÐ¾Ñ SQLSTATE пÑи Ñбое в ÑиÑÑемном вÑзове, в коÑоÑом пÑоиÑÑ Ð¾Ð´Ð¸Ñ Ð¾Ð±ÑаÑение к ÑокеÑам.errhidestmt(bool hide_stmt)Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñзвана Ð´Ð»Ñ Ð¿Ð¾Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñвода полÑÐÐÐÐ ÐТÐÐ :(STATEMENT:) в жÑÑнал ÑеÑвеÑа. ÐбÑÑно ÑÑо ÑмеÑÑно, когда Ñамо ÑообÑение вклÑÑÐ°ÐµÑ ÑекÑÑ ÑекÑÑего опеÑаÑоÑа.
ÐÑимеÑание
РвÑзове ereport ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð¼Ð°ÐºÑимÑм Ð¾Ð´Ð½Ñ Ð¸Ð· ÑÑнкÑий errtable, errtablecol, errtableconstraint, errdatatype или errdomainconstraint. ÐаннÑе ÑÑнкÑии ÑÑÑеÑÑвÑÑÑ Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³Ð»Ð¸ извлеÑÑ Ð¸Ð¼Ñ Ð¾Ð±ÑекÑа Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
, ÑвÑзанного Ñ ÑÑловием оÑибки, Ñак, ÑÑÐ¾Ð±Ñ Ð´Ð»Ñ ÑÑого им не ÑÑебовалоÑÑ ÑазбиÑаÑÑ ÑекÑÑ Ð¾Ñибки, возможно локализованнÑй. ÐÑи ÑÑнкÑии Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸ÑполÑзоваÑÑÑÑ Ð² ÑлÑÑае оÑибок, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¶ÐµÐ»Ð°ÑелÑной авÑомаÑиÑеÑÐºÐ°Ñ Ð¾Ð±ÑабоÑка. ÐÐ»Ñ Ð²ÐµÑÑии PostgreSQL 9.3 ÑÑÐ¾Ñ Ð¿Ð¾Ð´Ñ
од ÑаÑпÑоÑÑÑанÑеÑÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ ÑолÑко на оÑибки клаÑÑа SQLSTATE 23 (наÑÑÑение ÑелоÑÑноÑÑи огÑаниÑениÑ), но в бÑдÑÑем облаÑÑÑ ÐµÐ³Ð¾ пÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑаÑÑиÑена.
СÑÑеÑÑвÑÐµÑ Ñакже более ÑÑаÑаÑ, но Ñем не менее акÑивно иÑполÑзÑÐµÐ¼Ð°Ñ ÑÑнкÑÐ¸Ñ elog. ÐÑзов elog:
elog(level, "format string", ...);
полноÑÑÑÑ ÑавнознаÑен вÑзовÑ:
ereport(level, (errmsg_internal("format string", ...))); ÐамеÑÑÑе, ÑÑо код оÑибки SQLSTATE вÑегда опÑеделÑеÑÑÑ Ð½ÐµÑвно, а ÑÑÑока ÑообÑÐµÐ½Ð¸Ñ Ð½Ðµ Ð¿Ð¾Ð´Ð»ÐµÐ¶Ð¸Ñ Ð¿ÐµÑеводÑ. Таким обÑазом, elog ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ ÑолÑко Ð´Ð»Ñ Ð²Ð½ÑÑÑенниÑ
оÑибок и оÑладки на низком ÑÑовне. ÐÑбое ÑообÑение, коÑоÑое Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедÑÑавлÑÑÑ Ð¸Ð½ÑеÑÐµÑ Ð´Ð»Ñ Ð¾Ð±ÑÑнÑÑ
полÑзоваÑелей, должно пÑоÑ
одиÑÑ ÑеÑез ereport. Тем не менее, в ÑиÑÑеме еÑÑÑ Ð´Ð¾ÑÑаÑоÑно много внÑÑÑенниÑ
пÑовеÑок Ð´Ð»Ñ ÑлÑÑаев, «коÑоÑÑе не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑоиÑÑ
одиÑÑ», и в ниÑ
по-пÑÐµÐ¶Ð½ÐµÐ¼Ñ ÑиÑоко иÑполÑзÑеÑÑÑ elog; Ð´Ð»Ñ ÑакиÑ
ÑообÑений ÑÑа ÑÑнкÑÐ¸Ñ Ð¿ÑедпоÑиÑаеÑÑÑ Ð¸Ð·-за пÑоÑÑоÑÑ Ð·Ð°Ð¿Ð¸Ñи.
СовеÑÑ Ð¿Ð¾ напиÑÐ°Ð½Ð¸Ñ Ñ Ð¾ÑоÑÐ¸Ñ ÑообÑений об оÑÐ¸Ð±ÐºÐ°Ñ Ð¼Ð¾Ð¶Ð½Ð¾ найÑи в Разделе 51.3.
[13] То еÑÑÑ Ð·Ð½Ð°Ñение, коÑоÑое бÑло ÑекÑÑим, когда бÑла вÑзвана ereport; Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ errno во вÑпомогаÑелÑнÑÑ
ÑÑнкÑиÑÑ
вÑдаÑи ÑообÑений на него не повлиÑÑÑ. ÐÑо бÑÐ´ÐµÑ Ð½Ðµ Ñак, еÑли Ð²Ñ Ð·Ð°Ð¿Ð¸ÑеÑе strerror(errno) Ñвно в ÑпиÑке паÑамеÑÑов errmsg; поÑÑÐ¾Ð¼Ñ Ð´ÐµÐ»Ð°ÑÑ Ñак не нÑжно.