📄 exc.c
字号:
/*------------------------------------------------------------------------- * * exc.c * POSTGRES exception handling code. * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION * $Header: /usr/local/cvsroot/pgsql/src/backend/utils/error/exc.c,v 1.25.2.1 1999/08/02 05:25:04 scrappy Exp $ * * NOTE * XXX this code needs improvement--check for state violations and * XXX reset after handling an exception. * *------------------------------------------------------------------------- */#include <errno.h>#include "postgres.h"#include "storage/ipc.h"#include "utils/exc.h"static void ExcUnCaught(Exception *excP, ExcDetail detail, ExcData data, ExcMessage message);static void ExcPrint(Exception *excP, ExcDetail detail, ExcData data, ExcMessage message);/* * Global Variables */static bool ExceptionHandlingEnabled = false;char *ExcFileName = NULL;Index ExcLineNumber = 0;ExcFrame *ExcCurFrameP = NULL;static ExcProc *ExcUnCaughtP = NULL;extern char *ProgramName;/* * Exported Functions *//* * EnableExceptionHandling * Enables/disables the exception handling system. * * Note: * This must be called before any exceptions occur. I.e., call this first! * This routine will not return if an error is detected. * This does not follow the usual Enable... protocol. * This should be merged more closely with the error logging and tracing * packages. * * Exceptions: * none *//* * Excection handling should be supported by the language, thus there should * be no need to explicitly enable exception processing. * * This function should probably not be called, ever. Currently it does * almost nothing. If there is a need for this intialization and checking. * then this function should be converted to the new-style Enable code and * called by all the other module Enable functions. */voidEnableExceptionHandling(bool on){ if (on == ExceptionHandlingEnabled) { /* XXX add logging of failed state */ proc_exit(255); /* ExitPostgres(FatalExitStatus); */ } if (on) { /* initialize */ ; } else { /* cleanup */ ExcFileName = NULL; ExcLineNumber = 0; ExcCurFrameP = NULL; ExcUnCaughtP = NULL; } ExceptionHandlingEnabled = on;}static voidExcPrint(Exception *excP, ExcDetail detail, ExcData data, ExcMessage message){ extern int errno; extern int sys_nerr;#ifdef lint data = data;#endif fflush(stdout); /* In case stderr is buffered */#if 0 if (ProgramName != NULL && *ProgramName != '\0') fprintf(stderr, "%s: ", ProgramName);#endif if (message != NULL) fprintf(stderr, "%s", message); else if (excP->message != NULL) fprintf(stderr, "%s", excP->message); else#ifdef lint fprintf(stderr, "UNNAMED EXCEPTION 0x%lx", excP);#else fprintf(stderr, "UNNAMED EXCEPTION 0x%lx", (long) excP);#endif fprintf(stderr, " (%ld)", detail); if (errno > 0 && errno < sys_nerr) fprintf(stderr, " [%s]", strerror(errno)); else if (errno != 0) fprintf(stderr, " [Error %d]", errno); fprintf(stderr, "\n"); fflush(stderr);}#ifdef NOT_USEDExcProc *ExcGetUnCaught(void){ return ExcUnCaughtP;}#endif#ifdef NOT_USEDExcProc *ExcSetUnCaught(ExcProc *newP){ ExcProc *oldP = ExcUnCaughtP; ExcUnCaughtP = newP; return oldP;}#endifstatic voidExcUnCaught(Exception *excP, ExcDetail detail, ExcData data, ExcMessage message){ ExcPrint(excP, detail, data, message); ExcAbort(excP, detail, data, message);}voidExcRaise(Exception *excP, ExcDetail detail, ExcData data, ExcMessage message){ ExcFrame *efp; efp = ExcCurFrameP; if (efp == NULL) { if (ExcUnCaughtP != NULL) (*ExcUnCaughtP) (excP, detail, data, message); ExcUnCaught(excP, detail, data, message); } else { efp->id = excP; efp->detail = detail; efp->data = data; efp->message = message; ExcCurFrameP = efp->link;#if defined (JMP_BUF) longjmp(efp->context, 1);#else siglongjmp(efp->context, 1);#endif }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -