C語言錯誤處理方法、C++異常處理方法(throw, try, catch)簡介


一、C語言錯誤處理方法

1、返回值(if … else語句判斷錯誤)
2、errno(linux 系統調用)
3、goto語句(函數內局部跳轉)
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 
);
env

Variable 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  );
env

Variable in which environment is stored.

value

Value to be returned to setjmp call.

 C++ Code 
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,執行Divide函數,除數為0,longjump跳回到setjump處,返回參數1,故繼續輸出

divisiong by zero, setjump和longjump 已經是c++異常的雛形,即使Divide函數本身沒有調用longjump,而是調用了某個函數,在這個函數內longjump,也可以跳轉到setjump 處,這樣就不用通過一層層的函數返回值來判斷錯誤。

C語言的出錯處理被認為是緊耦合的,函數的使用者必須在非常靠近函數調用的地方編寫錯誤處理代碼,這會使得其變得笨拙以及難以使用。


二、C++異常處理方法(throw, try, catch)

錯誤處理代碼的編寫不再冗長乏味,並且不再與“正常”代碼混在一起。程序員可以將注意力集中於正常流程,然后在某個區域里編寫異常處理代碼。如果多次調用同一個函數,只需在一個地方編寫一次錯誤處理代碼。
錯誤不能被忽略。

 C++ Code 
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++編程規范


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM