ericasadun 2019-06-30
异常( Exception ) 与 Bug 的区别
异常
Bug
void func(...) { if( 判断是否产生异常 ) { 正常情况代码逻辑; } else { 异常情况代码逻辑; } }
#include <iostream> #include <string> using namespace std; double divide(double a, double b, int* valid) { const double delta = 0.00000000000001; double ret = 0; if( !((-delta < b) && (b < delta)) ) { ret = a / b; *valid = 1; } else { *valid = 0; } return ret; } int main() { int valid = 0; double r = divide(1, 0, &valid); if( valid ) { cout << "r = " << r << endl; } else { cout << "Divided by zero ..." << endl; } return 0; }
输出: Divided by zero ...
divide 函数调用后必须判断 valid 代表的结果
int setjmp(jmp_buf env)
void longjmp(jum_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.00000000000001; double ret = 0; if( !((-delta < b) && (b < delta)) ) { ret = a / b; } else { longjmp(env, 1); } return ret; } int main() { if( setjmp(env) == 0 ) { double r = divide(1, 0); cout << "r = " << r << endl; } else { cout << "Divided by zero ..." << endl; } return 0; }
输出: Divided by zero ...
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; }
问题:
阅读体较差,无法快速判断出哪一部分是正常逻辑代码,哪一部分是异常逻辑代码
以上内容参考狄泰软件学院系列课程,请大家保护原创