當(dāng)前位置:
首頁(yè) >
C语言中的异常处理
發(fā)布時(shí)間:2025/4/5
28
豆豆
文章目錄
- 1 C語(yǔ)言中的異常處理
- 1.1 異常的概念
- 1.2 C語(yǔ)言中經(jīng)典的異常處理方式
- 1.3 異常處理方式的優(yōu)化
1 C語(yǔ)言中的異常處理
1.1 異常的概念
異常的概念:
- 程序在運(yùn)行的過(guò)程中可能產(chǎn)生異常。
- 異常(Exception)與Bug的區(qū)別:
- 異常是程序運(yùn)行時(shí)可預(yù)料的執(zhí)行分支。
- Bug是程序中的錯(cuò)誤,是不被預(yù)期的運(yùn)行方式。
異常(Exception)和Bug的對(duì)比:
異常:
- 運(yùn)行時(shí)產(chǎn)生除0的情況
- 需要打開(kāi)的外部文件不存在
- 數(shù)組訪問(wèn)時(shí)越界
Bug:
- 使用野指針
- 堆數(shù)組使用結(jié)束未釋放
- 選擇排序無(wú)法處理長(zhǎng)度為0的數(shù)組
1.2 C語(yǔ)言中經(jīng)典的異常處理方式
C語(yǔ)言經(jīng)典處理方式:if…else…
編程實(shí)驗(yàn):異常處理代碼
編程實(shí)驗(yàn):除法操作異常處理
#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函數(shù)有3個(gè)參數(shù),難以理解其用法。
- divide函數(shù)調(diào)用后必須判斷valid代表的結(jié)果。
- 當(dāng)valid為true時(shí),運(yùn)算結(jié)果正常。
- 當(dāng)valid為false時(shí),運(yùn)算過(guò)程出現(xiàn)異常。
1.3 異常處理方式的優(yōu)化
通過(guò)setjmp()和longjmp()進(jìn)行優(yōu)化:
- int setjmp(jmp_buf env):將當(dāng)前上下文保存在jmp_buf結(jié)構(gòu)體中。
- void longjmp(jmp_buf env, int val):
- 從jmp_buf結(jié)構(gòu)體中恢復(fù)setjmp()保存的上下文。
- 最終從setjmp函數(shù)調(diào)用點(diǎn)返回,返回值為val。
編程實(shí)驗(yàn):除法操作異常處理優(yōu)化
#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);}return ret; }int main(int argc, char *argv[]) { if( setjmp(env) == 0 ){double r = divide(1, 1);cout << "r = " << r << endl;}else{cout << "Divided by zero..." << endl;}return 0; }setjmp()和longjmp()的引入會(huì)帶來(lái)如下缺陷:
- 必然涉及到使用全局變量。
- 暴力跳轉(zhuǎn)導(dǎo)致代碼可讀性降低。
- 本質(zhì)還是if…else…異常處理方式。
C語(yǔ)言中經(jīng)典異常處理方式會(huì)使得程序邏輯中混入大量的處理異常的代碼。正常邏輯代碼和異常處理代碼混合在一起,導(dǎo)致代碼迅速膨脹,難以維護(hù)。
參考資料:
總結(jié)
- 上一篇: 单例类模板
- 下一篇: 判断一个变量是不是指针