C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
一、C語言錯誤處理方法
1、返回值(if … else語句判斷錯誤)
2、errno(linux 系統(tǒng)調用)
3、goto語句(函數(shù)內局部跳轉)
4、setjmp、longjmp(Do not use setjmp and longjmp in C++ programs; these functions do not support C++ object semantics.?)
#define _JBLEN ?16
typedef _JBTYPE ?jmp_buf[_JBLEN];
Saves the current state of the program.
int setjmp(jmp_buf env ); ?Parameters envVariable in which environment is stored.
Returns 0 after saving the stack environment. If setjmp returns as a result of a?longjmp call, it returns the?value argument of?longjmp, or if the?value argument of?longjmp is 0,setjmp returns 1. There is no error return.
Restores stack environment and execution locale.
void?longjmp(?jmp_buf?env,?int?value? ); ?Parameters envVariable in which environment is stored.
Value to be returned to setjmp call.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | ? | #include?<stdio.h> #include?<setjmp.h> jmp_buf?buf; double?Divide(double?a,?double?b) { ????if?(b?==?0.0) ????{ ????????longjmp(buf,?1);????????//?throw ????} ????else ????????return?a?/?b; } int?main(void) { ????int?ret; ????ret?=?setjmp(buf); ????if?(ret?==?0)???????????//?try ????{ ????????printf("division?...\n"); ????????printf("%f\n",?Divide(5.0,?0.0)); ????} ????else?if?(ret?==?1)??????//?catch ????{ ????????printf("divisiong?by?zero\n"); ????} ????return?0; } |
分析一下,首先setjump設置成功返回0,執(zhí)行Divide函數(shù),除數(shù)為0,longjump跳回到setjump處,返回參數(shù)1,故繼續(xù)輸出
divisiong by zero, setjump和longjump 已經是c++異常的雛形,即使Divide函數(shù)本身沒有調用longjump,而是調用了某個函數(shù),在這個函數(shù)內longjump,也可以跳轉到setjump 處,這樣就不用通過一層層的函數(shù)返回值來判斷錯誤。
C語言的出錯處理被認為是緊耦合的,函數(shù)的使用者必須在非常靠近函數(shù)調用的地方編寫錯誤處理代碼,這會使得其變得笨拙以及難以使用。
二、C++異常處理方法(throw, try, catch)
錯誤處理代碼的編寫不再冗長乏味,并且不再與“正常”代碼混在一起。程序員可以將注意力集中于正常流程,然后在某個區(qū)域里編寫異常處理代碼。如果多次調用同一個函數(shù),只需在一個地方編寫一次錯誤處理代碼。
錯誤不能被忽略。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | ? | #include?<iostream> using?namespace?std; double?Divide(double?a,?double?b) { ????if?(b?==?0.0) ????{ ????????throw?1;????????//?throw ????} ????else ????????return?a?/?b; } int?main(void) { ????try?????????//?try ????{ ????????cout?<<?"division?..."?<<?endl; ????????cout?<<?Divide(3.0,?1.0)?<<?endl; ????????cout?<<?Divide(5.0,?0.0)?<<?endl; ????} ????catch?(int)?????//?catch ????{ ????????cout?<<?"divisiong?by?zero"?<<?endl; ????} ????return?0; } |
即無論在多遠throw,都可以被catch到,但需要注意的是類型需要匹配,下面的文章將討論拋出自定義類型的異常。
參考:
C++ primer 第四版
Effective C++ 3rd
C++編程規(guī)范
轉載于:https://www.cnblogs.com/alantu2018/p/8471124.html
總結
以上是生活随笔為你收集整理的C语言错误处理方法、C++异常处理方法(throw, try, catch)简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 剥开比原看代码(十七):比原是如何显示交
- 下一篇: 【转载】android客服端+eps82