1.1、
程式在執行過程中可能產生
異常
1.2、
異常(exception
)與bug
的區別1.2.1、
異常
是程式執行時
可預料
的執行分支
1.2.2、
bug
是程式是的錯誤,是
不被預期
的執行方式
2.1、
異常:如執行時產生
除0
的情況、需要開啟的
外部檔案不存在
、陣列訪問時
越界
2.2、
bug:如使用
野指標
、堆陣列使用結束後未釋放
、選擇排序無法處理
長度為0的陣列
3.1、示例程式
void func(…)
else
}/*************** 除法操作異常處理 ************/
#include
using namespace std;
double divide(double a, double b, int* valid)
else
return ret; }
//如果只有兩個引數,那麼異常為0和實際為0無法分辨。
int main()
else
return 0; }
3.2、缺陷
3.2.1、
divide函式有3個引數,
難以理解其用途
3.2.2、
divide函式呼叫後必須
判斷valid代表的結
果
:true表示結果正常,false表示出現異常
4.1、
通過setjmp()
和longjmp()
進行優化
4.1.1、
包含標頭檔案#include 或
4.1.2、
intsetjmp
(jmp_buf env):將
當前上下文儲存在jum_buf結構體
中,以供以後longjmp()恢復狀態資訊時使用。如果是直接呼叫setjmp(),那麼返回值為0;如果是由於呼叫longjmp()而呼叫setjmp(),那麼返回值非0。setjmp()只能在某些特定情況下呼叫,如在if語句、 switch語句及迴圈語句的條件測試部分以及一些簡單的關係表示式中。
4.1.3、
void
longjmp
(jmp_buf env, int val):
用於恢復
由最近一次呼叫setjmp()時儲存到env的狀態資訊。當它執行完時,
程式執行流會跳轉到setjmp()那行
,並根據重新執行setjmp(),但此時的
setjmp()得到的返回值是val。
/*************** 除法操作異常處理優化 ************/
#include
#include //for setjmp, longjmp();
using namespace std;
static jmp_buf env; //須定義全域性的上下文環境。 static避免別的檔案使用。作用域限定符號(修飾全域性變數時,就是這個作用)
double divide(double a, double b)
else
return ret; }
//分析函式時先從main函式分析,
int main()
else
return 0; }
4.2、
缺陷
4.2.1、
引入setjmp()和longjmp()
必然涉及到使用全域性變數
4.2.2、
暴力跳轉
導致**可讀性降低
4.2.3、
本質還是if-else異常處理方式
5.1、
會使程式邏輯中
混入大量的處理異常的**
5.2、
正常邏輯和異常處理**混合
在一起,導致**迅速膨脹,難以維護。
/************ 異常處理**分析 ************/
#include
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 (length < 4)
if( (v < 0) || (v > 9) )
unsigned char* p = (unsigned char*)dest;
for(int i = 0; i< length; i++)
return success; }
int main()
else if(ret == invalid_pointer)
else if(ret == invalid_length)
else if(ret == invalid_parameter)
return 0; }
6.1、
程式中不可避免的會
發生異常
6.2、
異常是在開發階段就
可以預見
的執行時問題
6.3、
c語言中通過
經典的if-else
6.4、
c++中存在
更好的異常處理
方式
63 C語言異常處理
異常的概念 程式在執行過程中可能產生異常,異常與bug的區別 異常是程式執行時可預料的執行分支。bug是程式中的錯誤,是不被預期的執行方式。異常 執行時除0的情況,需要開啟的外部檔案,陣列訪問時越界。bug 使用野指標,堆陣列使用結束後未釋放,選擇排序無法處理長度為0的陣列。c語言處理方式 if.e...
63 C語言異常處理
目錄 1.異常處理 程式設計實驗 除法操作異常處理 2.異常處理的方式 程式設計實驗 除法操作異常處理優化 例項分析 異常處理 分析 3.小結 異常的概念 異常是程式執行時可預料的執行分支 bug是程式中的錯誤,是不被預期的執行方式 異常 exception 和bug的對比 異常執行時產生除0的情況...
第08課 服務異常處理
我們的服務最終是部署在伺服器上,因為各種原因,服務難免會發生故障,那麼其他服務去呼叫這個服務就會調不到,甚至會一直卡在那裡,導致使用者體驗不好。針對這個問題,我們就需要對服務介面做錯誤處理,一旦發現無法訪問服務,則立即返回並報錯,我們捕捉到這個異常就可以以可讀化的字串返回到前端。為了解決這個問題,業...