[讨论]C中用setjmp和longjmp实现TRY...CATCH的不足与优越性,见者有分.
原创代码,不足之处请见凉
/*error.h*/ #ifndef _ERROR_H #define _ERROR_H #include <setjmp.h> #include <string.h> #define TRY ErrNum = setjmp(Resume);if(0 == ErrNum)#define CATCH(n) else if((0 != ErrNum) && (((n) == ErrNum) || ((n) == ALL_ERROR)))#define THROW(n) longjmp((Resume),(n)) #define GET_ErrorString(n) errString[n]typedef enum { ERROR_NONE, ERROR_TEST, MEMORY_OFFER, DIVSION_BY_ZERO, OUT_OF_RUN,/* 加入其它的错误号 */ ALL_ERROR,}ERROR_E; const char* errString[]= { "", "Error Test", "Not enough memory", "Divsion by zero", "Out of run",/* 加入错误号所对应的错误信息 */ }; int ErrNum = 0; jmp_buf Resume = {0}; #endif /*_ERROR_H*/ /*main.c*/ #include <stdio.h> #include <stdlib.h> #include "error.h" extern int ErrNum;int main(void) { int n = 0; printf("Input N:"); scanf("%d",&n); TRY { int j = 0; if(0 >= n) { THROW(ERROR_TEST); } else if(n > 0 ) { printf("N is:%d\n",n); } while (1) { j++; if(j > 100000) THROW(OUT_OF_RUN); } } CATCH(ALL_ERROR) { printf("%s,ErrNum:%d!\n",GET_ErrorString(ErrNum),ErrNum); exit(ErrNum); } }