mirror of
https://github.com/postgres/postgres.git
synced 2025-11-06 07:49:08 +03:00
PG_FINALLY
This gives an alternative way of catching exceptions, for the common
case where the cleanup code is the same in the error and non-error
cases. So instead of
PG_TRY();
{
... code that might throw ereport(ERROR) ...
}
PG_CATCH();
{
cleanup();
PG_RE_THROW();
}
PG_END_TRY();
cleanup();
one can write
PG_TRY();
{
... code that might throw ereport(ERROR) ...
}
PG_FINALLY();
{
cleanup();
}
PG_END_TRY();
Discussion: https://www.postgresql.org/message-id/flat/95a822c3-728b-af0e-d7e5-71890507ae0c%402ndquadrant.com
This commit is contained in:
@@ -2028,22 +2028,15 @@ asyncQueueReadAllNotifications(void)
|
||||
snapshot);
|
||||
} while (!reachedStop);
|
||||
}
|
||||
PG_CATCH();
|
||||
PG_FINALLY();
|
||||
{
|
||||
/* Update shared state */
|
||||
LWLockAcquire(AsyncQueueLock, LW_SHARED);
|
||||
QUEUE_BACKEND_POS(MyBackendId) = pos;
|
||||
LWLockRelease(AsyncQueueLock);
|
||||
|
||||
PG_RE_THROW();
|
||||
}
|
||||
PG_END_TRY();
|
||||
|
||||
/* Update shared state */
|
||||
LWLockAcquire(AsyncQueueLock, LW_SHARED);
|
||||
QUEUE_BACKEND_POS(MyBackendId) = pos;
|
||||
LWLockRelease(AsyncQueueLock);
|
||||
|
||||
/* Done with snapshot */
|
||||
UnregisterSnapshot(snapshot);
|
||||
}
|
||||
|
||||
@@ -1916,13 +1916,11 @@ BeginCopyTo(ParseState *pstate,
|
||||
{
|
||||
cstate->copy_file = AllocateFile(cstate->filename, PG_BINARY_W);
|
||||
}
|
||||
PG_CATCH();
|
||||
PG_FINALLY();
|
||||
{
|
||||
umask(oumask);
|
||||
PG_RE_THROW();
|
||||
}
|
||||
PG_END_TRY();
|
||||
umask(oumask);
|
||||
if (cstate->copy_file == NULL)
|
||||
{
|
||||
/* copy errno because ereport subfunctions might change it */
|
||||
|
||||
@@ -934,13 +934,11 @@ EventTriggerSQLDrop(Node *parsetree)
|
||||
{
|
||||
EventTriggerInvoke(runlist, &trigdata);
|
||||
}
|
||||
PG_CATCH();
|
||||
PG_FINALLY();
|
||||
{
|
||||
currentEventTriggerState->in_sql_drop = false;
|
||||
PG_RE_THROW();
|
||||
}
|
||||
PG_END_TRY();
|
||||
currentEventTriggerState->in_sql_drop = false;
|
||||
|
||||
/* Cleanup. */
|
||||
list_free(runlist);
|
||||
@@ -1007,17 +1005,13 @@ EventTriggerTableRewrite(Node *parsetree, Oid tableOid, int reason)
|
||||
{
|
||||
EventTriggerInvoke(runlist, &trigdata);
|
||||
}
|
||||
PG_CATCH();
|
||||
PG_FINALLY();
|
||||
{
|
||||
currentEventTriggerState->table_rewrite_oid = InvalidOid;
|
||||
currentEventTriggerState->table_rewrite_reason = 0;
|
||||
PG_RE_THROW();
|
||||
}
|
||||
PG_END_TRY();
|
||||
|
||||
currentEventTriggerState->table_rewrite_oid = InvalidOid;
|
||||
currentEventTriggerState->table_rewrite_reason = 0;
|
||||
|
||||
/* Cleanup. */
|
||||
list_free(runlist);
|
||||
|
||||
|
||||
@@ -942,17 +942,13 @@ execute_extension_script(Oid extensionOid, ExtensionControlFile *control,
|
||||
|
||||
execute_sql_string(c_sql);
|
||||
}
|
||||
PG_CATCH();
|
||||
PG_FINALLY();
|
||||
{
|
||||
creating_extension = false;
|
||||
CurrentExtensionObject = InvalidOid;
|
||||
PG_RE_THROW();
|
||||
}
|
||||
PG_END_TRY();
|
||||
|
||||
creating_extension = false;
|
||||
CurrentExtensionObject = InvalidOid;
|
||||
|
||||
/*
|
||||
* Restore the GUC variables we set above.
|
||||
*/
|
||||
|
||||
@@ -493,16 +493,11 @@ CreateSubscription(CreateSubscriptionStmt *stmt, bool isTopLevel)
|
||||
slotname)));
|
||||
}
|
||||
}
|
||||
PG_CATCH();
|
||||
PG_FINALLY();
|
||||
{
|
||||
/* Close the connection in case of failure. */
|
||||
walrcv_disconnect(wrconn);
|
||||
PG_RE_THROW();
|
||||
}
|
||||
PG_END_TRY();
|
||||
|
||||
/* And we are done with the remote side. */
|
||||
walrcv_disconnect(wrconn);
|
||||
}
|
||||
else
|
||||
ereport(WARNING,
|
||||
@@ -1023,16 +1018,12 @@ DropSubscription(DropSubscriptionStmt *stmt, bool isTopLevel)
|
||||
|
||||
walrcv_clear_result(res);
|
||||
}
|
||||
PG_CATCH();
|
||||
PG_FINALLY();
|
||||
{
|
||||
/* Close the connection in case of failure */
|
||||
walrcv_disconnect(wrconn);
|
||||
PG_RE_THROW();
|
||||
}
|
||||
PG_END_TRY();
|
||||
|
||||
walrcv_disconnect(wrconn);
|
||||
|
||||
pfree(cmd.data);
|
||||
|
||||
table_close(rel, NoLock);
|
||||
|
||||
@@ -2431,13 +2431,11 @@ ExecCallTriggerFunc(TriggerData *trigdata,
|
||||
{
|
||||
result = FunctionCallInvoke(fcinfo);
|
||||
}
|
||||
PG_CATCH();
|
||||
PG_FINALLY();
|
||||
{
|
||||
MyTriggerDepth--;
|
||||
PG_RE_THROW();
|
||||
}
|
||||
PG_END_TRY();
|
||||
MyTriggerDepth--;
|
||||
|
||||
pgstat_end_function_usage(&fcusage, true);
|
||||
|
||||
|
||||
@@ -430,17 +430,13 @@ vacuum(List *relations, VacuumParams *params,
|
||||
}
|
||||
}
|
||||
}
|
||||
PG_CATCH();
|
||||
PG_FINALLY();
|
||||
{
|
||||
in_vacuum = false;
|
||||
VacuumCostActive = false;
|
||||
PG_RE_THROW();
|
||||
}
|
||||
PG_END_TRY();
|
||||
|
||||
in_vacuum = false;
|
||||
VacuumCostActive = false;
|
||||
|
||||
/*
|
||||
* Finish up processing.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user