中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

C語(yǔ)言異常處理(五十二)

        我們今天來(lái)看下異常處理,在看 C++ 的異常處理之前,先來(lái)看看 C 語(yǔ)言中的異常處理。那么什么是異常呢?在程序運(yùn)行過(guò)程中可能會(huì)產(chǎn)生異常,異常(Exception)與 Bug 的區(qū)別是:異常是程序運(yùn)行時(shí)可預(yù)料的執(zhí)行分支,而 Bug 是程序中的錯(cuò)誤,是不被預(yù)期的運(yùn)行方式。

且末網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,且末網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為且末上千余家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的且末做網(wǎng)站的公司定做!

        下來(lái)我們來(lái)看看異常和 Bug 的對(duì)比:a> 異常比如運(yùn)行時(shí)產(chǎn)生除 0 的情況,需要打開(kāi)的外部文件不存在,數(shù)組訪問(wèn)時(shí)越界;b> Bug 是使用野指針,堆數(shù)組使用結(jié)束后未釋放,選擇排序無(wú)法處理長(zhǎng)度為 0 的數(shù)組。在 C 語(yǔ)言中的經(jīng)典處理方式為:if ... else ... 。if 語(yǔ)句中處理的是正常情況代碼邏輯,else 語(yǔ)句中處理的是異常情況代碼邏輯。

        我們還是以代碼為例來(lái)看看除法操作異常的處理

#include <iostream>
#include <string>

using namespace std;

double divide(double a, double b)
{
    const double delta = 0.000000000000001;
    double ret = 0;
    
    if( !((-delta < b) && (b < delta)) )
    {
        ret = a / b;
    }
    else
    {
        ret = 0;
    }
    
    return ret;
}

int main()
{
    cout << divide(1, 1) << endl;
    cout << divide(1, 0) << endl;

    return 0;
}

        我們看看編譯結(jié)果

C 語(yǔ)言異常處理(五十二)

        執(zhí)行的結(jié)果是正確的,但是如果我們打印的是 0/1 的結(jié)果呢?我們就不知道執(zhí)行的到底是正確的情況還是異常的情況。那么我們?cè)谏厦娉绦蛑械?divide 函數(shù)中添加一個(gè)參數(shù),用來(lái)表示執(zhí)行結(jié)果的正確與否,根據(jù)這個(gè)參數(shù)的值來(lái)判斷執(zhí)行是否正常。程序如下

#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 valid = 0;
    double r = divide(1, 0, &valid);
    
    if( valid )
    {
        cout << "r = " << r << endl;
    }
    else
    {
        cout << "Divided by zero..." << endl;
    }

    return 0;
}

        我們來(lái)看看編譯結(jié)果

C 語(yǔ)言異常處理(五十二)

        再來(lái)試試 0/1 呢

C 語(yǔ)言異常處理(五十二)

        我們看到結(jié)果已經(jīng)正確的執(zhí)行了。但是這個(gè)程序有個(gè)缺陷,便是 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)算結(jié)果出現(xiàn)異常。在 C 語(yǔ)言還有一種異常處理的方式,通過(guò) setjmp() 和 longjmp()進(jìn)行判斷。下來(lái)我們來(lái)講講這兩個(gè)函數(shù)的原型及其意思:a> int setjmp(jmp_buf env) 是將當(dāng)前上下文保存在 jmp_buf 結(jié)構(gòu)體中;b> void longjmp(jmp_buf env, int val) 從 jmp_buf 結(jié)構(gòu)體中恢復(fù) setjmp() 保存的上下文,最終從 setjmp 函數(shù)調(diào)用點(diǎn)返回,返回值為 val;下來(lái)我們通過(guò)示例代碼來(lái)進(jìn)行分析

#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()
{
    if( setjmp(env) == 0 )
    {
        double r = divide(1, 0);
        
        cout << "r = " << r << endl;
    }
    else
    {
        cout << "Divided by zero..." << endl;
    }

    return 0;
}

        在它進(jìn)入 main 函數(shù)的 if 語(yǔ)句后,會(huì)將 0 保存在當(dāng)前的 env 中,然后 setjmp 函數(shù)會(huì)保存當(dāng)前的上下文信息。然后執(zhí)行 divide 函數(shù),進(jìn)入到 divide 函數(shù)中,會(huì)進(jìn)入到 else 分支。longjmp 函數(shù)則會(huì)將 1 保存到 env 中并將程序的執(zhí)行流跳轉(zhuǎn)到 setjmp 處,此時(shí) env 為 1,因此條件不成立,所以會(huì)打印出 Divided by zero...,我們來(lái)看看編譯結(jié)果

C 語(yǔ)言異常處理(五十二)

        我們?cè)賮?lái)看看 1/1 呢,進(jìn)入到 divide 函數(shù)中,它會(huì)執(zhí)行 if 語(yǔ)句進(jìn)行正常的計(jì)算之后直接便會(huì)返回 ret,便會(huì)輸出結(jié)果

C 語(yǔ)言異常處理(五十二)

        雖然這是兩個(gè)參數(shù),但是它有一定的缺陷。setjmp() 和 longjmp() 的引入就必然涉及到使用全局變量,暴力跳轉(zhuǎn)導(dǎo)致代碼的可讀性降低,其本質(zhì)還是 if ... else ... 異常處理方式。它的暴力跳轉(zhuǎn)會(huì)破壞 C 語(yǔ)言的結(jié)構(gòu)化特性(順序執(zhí)行、選擇執(zhí)行、循環(huán)執(zhí)行)。C 語(yǔ)言中的經(jīng)典異常處理方式會(huì)使得程序中邏輯混入大量的處理異常的代碼。正常邏輯代碼和異常處理代碼混合在一起,導(dǎo)致代碼迅速膨脹,難以維護(hù)。那么在 C++ 中肯定便會(huì)有更好的異常處理方式,我們后面會(huì)繼續(xù)學(xué)習(xí)。通過(guò)對(duì) C 語(yǔ)言中異常處理的學(xué)習(xí),總結(jié)如下:1、程序中不可避免的會(huì)發(fā)生異常;2、異常是在開(kāi)發(fā)階段就可以預(yù)見(jiàn)的運(yùn)行時(shí)問(wèn)題;3、C 語(yǔ)言中通過(guò)經(jīng)典的 if ... else ... 方式處理異常,在 C++ 中存在更好的異常處理方式。

        歡迎大家一起來(lái)學(xué)習(xí) C++ 語(yǔ)言,可以加我QQ:243343083。

分享題目:C語(yǔ)言異常處理(五十二)
網(wǎng)頁(yè)路徑:http://www.rwnh.cn/article26/jipojg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、網(wǎng)站營(yíng)銷(xiāo)、關(guān)鍵詞優(yōu)化、網(wǎng)站策劃網(wǎng)站建設(shè)、微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化
潮安县| 曲沃县| 普格县| 崇仁县| 思茅市| 崇仁县| 濮阳市| 鄂托克旗| 南雄市| 霞浦县| 金阳县| 固始县| 徐闻县| 壶关县| 平江县| 马鞍山市| 新丰县| 临朐县| 闽清县| 清原| 阳原县| 镇坪县| 昭平县| 罗田县| 大安市| 石林| 衡东县| 乌什县| 张家口市| 涡阳县| 竹北市| 尉氏县| 广灵县| 咸阳市| 揭西县| 龙陵县| 喀喇沁旗| 东丽区| 平遥县| 安福县| 观塘区|