異常(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中很差的方式進行了升級