Возврат сведений об ошибке в вызывающую функцию после перехвата исключения в Postgresql - PullRequest
1 голос
/ 23 марта 2012

Я добавляю обработку исключений в хранимые процедуры PostgreSQL, чтобы автоматически откатывать транзакции после возникновения ошибки.

Моя проблема в том, что, как только я поймаю исключение, я не смогу вернуть сведения об ошибкек вызывающей программе C, которая использует libpq.

Значения серьезности, SQLSTATE, Primary, Detail и Hint равны нулю.Есть ли способ вернуть их после перехвата исключения?

Функция libpq, которую я использую для сбора этих значений, - это PQresultErrorField ().

Ответы [ 2 ]

3 голосов
/ 23 марта 2012

Если исключение автоматически приведет к откату транзакции postgresql, зачем вообще ее перехватывать? Перехват исключений обычно полезен только в том случае, если вы хотите с пользой исправить ошибку, а не распространять ее.

1 голос
/ 23 марта 2012

Недавно я опубликовал полное решение , как добавить КОНТЕКСТ к сообщениям об ошибках на dba.SE . Хитрость заключается в том, чтобы вызвать функцию, которая вызывает ошибку / предупреждение / уведомление / и т.д.

Теперь я понимаю, что ваш случай может быть другим. Мой обходной путь - добавление КОНТЕКСТА к исключениям, которые вы поднимаете сами.

Если вы поймали исключение для выполнения каких-либо действий до отката транзакции, вы можете добавить RAISE без параметров в конце блока исключений:

RAISE;

Руководство о RAISE :

Последний вариант RAISE вообще не имеет параметров. Эта форма может только использоваться внутри предложения EXCEPTION блока BEGIN; это вызывает ошибку в настоящее время обрабатывается для повторного выброса.

Однако, как указал @araqnid, в блоке исключений нет необходимости, если вы все равно собираетесь распространять ошибку, и все откатывается. Это решение полезно только в тех редких случаях, когда определенные изменения являются постоянными и не могут быть отменены, например, dblink Calls ...

...