异常(Exception) 与 Bug 的区别html
异常ios
Bug编程
void func(...) { if(判断是否产生异常) { 正常状况代码逻辑 } else { 异常状况代码逻辑 } }
include <iostream> #include <string> using namespace std; double divide(double a, double b, int* valid) { const double delta = 0.000000000000001; double ret = 0; if( !((-delta < b) && (b < delta)) ) // 除法被除数 写法须要学习一下 { ret = a / b; *valid = 1; } else { *valid = 0; } return ret; } int main(int argc, char *argv[]) { int valid = 0; double r = divide(1, 0, &valid); if( valid ) { cout << "r = " << r << endl; } else { cout << "Divided by zero..." << endl; } return 0; }
divide 函数调用后必需判断 valid 表明的结果数组
经过 setjmp()
和 longjmp()
进行优化ide
int setjmp(jmp_buf env)
将当前上下文保存在 jmp_buf 结构体中函数
void longjmp(jmp_buf env, int val)
学习
#include <iostream> #include <string> #include <csetjmp> using namespace std; static jmp_buf env; double divide(double a, double b) { const double delta = 0.000000000000001; double ret = 0; if( !((-delta < b) && (b < delta)) ) { ret = a / b; } else { longjmp(env, 1); // 根据 env 恢复上下文,出口时在 setjmp() 处,longjmp 函数的功能是从 jmp_buf 结构体中恢复由 setjmp 函数保存的上下文,该函数不返回,而是从 setjmp 函数中返回。 } return ret; } int main(int argc, char *argv[]) { if( setjmp(env) == 0 ) // 直接调用,将函数在此处的上下文保存在 env 这个变量里,以供 longjmp 今后结构体中恢复。 { double r = divide(1, 1); cout << "r = " << r << endl; } else { cout << "Divided by zero..." << endl; } return 0; }
具体看以下连接: 优化
linkspa
setjmp() 和 longjmp() 的引入指针
C语言处理的方式不是很好,会使得程序中逻辑中混入大量的处理异常的代码。
正常逻辑代码和异常代码混合在一块儿,致使代码迅速膨胀 ,难以维护
#include <iostream> #include <string> using namespace std; #define SUCCESS 0 #define INVALID_POINTER -1 #define INVALID_LENGTH -2 #define INVALID_PARAMETER -3 int MemSet(void* dest, unsigned int length, unsigned char v) { if( dest == NULL ) { return INVALID_POINTER; } if( length < 4 ) { return INVALID_LENGTH; } if( (v < 0) || (v > 9) ) { return INVALID_PARAMETER; } unsigned char* p = (unsigned char*)dest; for(int i=0; i<length; i++) { p[i] = v; } return SUCCESS; } int main(int argc, char *argv[]) { int ai[5]; int ret = MemSet(ai, sizeof(ai), 0); if( ret == SUCCESS ) { } else if( ret == INVALID_POINTER ) { } else if( ret == INVALID_LENGTH ) { } else if( ret == INVALID_PARAMETER ) { } return ret; }
向上述代码是一眼看不出正常逻辑的过程的,若是去别的公司看代码代码都是这样就很难立刻知道正确逻辑是怎么运行的,不利于快速上手代码
C语言中中只能这样,全部C++将C中很差的方式进行了升级