最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++中異常處理詳解及其作用介紹

 更新時(shí)間:2021年09月02日 15:32:21   作者:我是小白呀  
這篇文章主要介紹了C/C++中異常處理詳解及其作用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

概述

作為一名專業(yè)寫 Bug, 編程一天改 bug 一周的程序媛. 學(xué)會(huì)異常處理是非常重要的. 我們不僅要考慮沒有錯(cuò)誤的理想情況, 更要考慮存在錯(cuò)誤時(shí)的情況.

在這里插入圖片描述

Debug 可以幫助我們盡快發(fā)現(xiàn)錯(cuò)誤, 消除錯(cuò)誤. 錯(cuò)誤類別:

  • 語法錯(cuò)誤
  • 運(yùn)行錯(cuò)誤
  • 邏輯錯(cuò)誤

異常處理

設(shè)計(jì)程序時(shí), 事先分析程序運(yùn)行時(shí)可能出現(xiàn)的各種意外情況, 定制出相應(yīng)的處理方法. 異常處理指對(duì)運(yùn)行時(shí)出現(xiàn)的差錯(cuò)以及其他例外情況的處理.

在這里插入圖片描述

沒有異常處理程序時(shí), 運(yùn)行出現(xiàn)異常, 程序只能終止運(yùn)行. 設(shè)置了異常處理機(jī)制, 運(yùn)行出現(xiàn)異常, 程序的流程就轉(zhuǎn)到異常處理代碼段處理. 用戶可以指定進(jìn)行任何的處理.

舉一個(gè)除數(shù)為 0 的例子:

#include <iostream>
using namespace std;

template <typename T>
T Div(T x, T y);

int main() {
    // 聲明變量
    int x, y;
    double x1, y1;

    // 賦值
    cin >> x >> y;
    cin >> x1 >> y1;

    // 輸出商
    cout << x << "/" << y << "=" << Div(x, y) << endl;
    cout << x1 << "/" << y1 << "=" << Div(x1, y1) << endl;

    return 0;
}

template <typename T>
T Div(T x, T y) {
    return x / y;
}

輸出結(jié)果:

在這里插入圖片描述

眾所周知分母不能為 0, 所以在這里我們可以看見程序終止運(yùn)行了.

異常處理機(jī)制

我們把程序運(yùn)行時(shí)的錯(cuò)誤統(tǒng)稱為異常. 對(duì)異常的處理統(tǒng)稱為異常處理. C++ 中所提供的異常處理機(jī)制結(jié)構(gòu)清晰, 在一定程度上可以保證程序的健壯性.

在這里插入圖片描述

C++ 中處理異常的過程:

  • 在執(zhí)行程序發(fā)生異常, 可以不在本函數(shù)中處理. 而是拋出一個(gè)錯(cuò)誤信息, 把它傳遞給上一級(jí)的函數(shù)來解決. 上一級(jí)解決不了, 再傳給其上一級(jí), 由其上一級(jí)處理.
  • 如此主機(jī)上傳, 直到最高一級(jí)還無法處理的話, 運(yùn)行系統(tǒng)會(huì)調(diào)用 abort 終止程序.

格式:

try {
    被檢查語句
    throw 異常
}
catch(異常類型1) {
    進(jìn)行異常處理的語句1
}
catch(異常類型2) {
    進(jìn)行異常處理的語句2
}
  • 把需要檢查的語句放在 try 模塊中
  • try 和 catch 作為一個(gè)整體出現(xiàn)
  • try 和 catch 塊中必須用話括號(hào)括起來, 即使花括號(hào)內(nèi)只有一個(gè)語句
  • 檢查語句發(fā)生錯(cuò)誤, throw 拋出異常, 發(fā)出錯(cuò)誤信息
  • 由 catch 來捕捉異常信息, 并加以處理
  • 一個(gè) try-catch 結(jié)構(gòu)中只能有一個(gè) try 塊, 但卻可以有多個(gè) catch 塊, 以便匹配不同的異常信息
  • 一般 throw 拋出的異常要和 catch 所捕獲的異常類型所匹配
  • catch 后面的圓括號(hào)中, 一般只寫異常信息的類型名, 如 catch (double)
  • 如果 throw 拋出異常信息找不到與之匹配的 catch 塊, 那么系統(tǒng)就會(huì)調(diào)用一個(gè)系統(tǒng)函數(shù) terminate, 使程序終止運(yùn)行

函數(shù)聲明指定異常

我們可以在函數(shù)聲明中指定異常情況, 這樣我們?cè)诳闯绦驎r(shí)能夠知道所用的函數(shù)是否會(huì)拋出異常信息以及異常信息可能的類型. C++ 允許在聲明函數(shù)時(shí)列出可能拋出的異常類型.

在這里插入圖片描述

聲明一個(gè)不能拋出異常的函數(shù):

double triangle(double,double,double) throw();

聲明一個(gè)能拋出異常的函數(shù):

int triangle(int a, int b, int c) throw(runtime_error);

注: 要指定異常類型, 必須在聲明和定義時(shí)都指定, 且類型相同.

練習(xí)

案例一

防止除數(shù)為 0:

#include <iostream>
using namespace std;

template <typename T>
T Div(T x, T y);

int main() {
    // 聲明變量
    int x, y;
    double x1, y1;

    // 賦值
    cout << "Please enter two int:\n";
    cin >> x >> y;
    cout << "Please enter two double:\n";
    cin >> x1 >> y1;

    try {
        // 被檢查的語句
        cout << x << "/" << y << "=" << Div(x, y) << endl;
        cout << x1 << "/" << y1 << "=" << Div(x1, y1) << endl;
    } catch (int) {  // 異常類型
        cerr << "除數(shù)為 0, 計(jì)算錯(cuò)誤!" << endl;  // 異常處理數(shù)據(jù)
    } catch (double ) {  // 異常類型
        cerr << "除數(shù)為 0.0, 計(jì)算錯(cuò)誤!" << endl;  // 異常處理數(shù)據(jù)
    }

    return 0;
}

template <typename T>
T Div(T x, T y) {
    if (y == 0){
        throw y;  // 拋出異常
    }

    return x / y;
}

輸出結(jié)果:

Please enter two int:
1 2
Please enter two double:
2 0.0
除數(shù)為 0.0, 計(jì)算錯(cuò)誤!
1/2=0
2/0=

案例二

求三角形周長(zhǎng), 防止三邊小于零或組不成三角形.

#include <iostream>

using namespace std;

int triangle(int a, int b, int c);

int main() {
    // 聲明變量
    int a, b, c;

    // 賦值
    cout << "Please enter the three side of the triangle:\n";
    cin >> a >> b >> c;

    try {
        // 被檢查的語句
        cout << "length of the triangle: " << triangle(a, b, c) << endl;
    } catch (const runtime_error &error) {  // 異常類型
        cerr << error.what() << endl;  // 異常處理數(shù)據(jù)
    }

    return 0;
}

int triangle(int a, int b, int c) {
    if (a <= 0 || b <= 0 || c <= 0) {
        throw runtime_error("The sides of the triangle cannot be less than or equal to zero");
    } else if (a + b <= c || a + c <= b || b + c <= a) {
        throw runtime_error("The lengths of three sides can't form triangle");
    }
    return a + b + c;
}

輸出結(jié)果:

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

到此這篇關(guān)于C/C++中異常處理詳解及其作用介紹的文章就介紹到這了,更多相關(guān)C++異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入分析C++中類的大小

    深入分析C++中類的大小

    本篇文章深入分析了C++中類的大小問題。需要的朋友參考下
    2013-05-05
  • 用代碼和UML圖化解設(shè)計(jì)模式之橋接模式的深入分析

    用代碼和UML圖化解設(shè)計(jì)模式之橋接模式的深入分析

    本篇文章是對(duì)橋接模式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實(shí)現(xiàn)關(guān)系與關(guān)系矩陣的代碼詳解

    C++實(shí)現(xiàn)關(guān)系與關(guān)系矩陣的代碼詳解

    這篇文章主要介紹了C++實(shí)現(xiàn)關(guān)系與關(guān)系矩陣,功能實(shí)現(xiàn)包括關(guān)系的矩陣表示,關(guān)系的性質(zhì)判斷及關(guān)系的合成,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C++命名空間using?namespace?std是什么意思

    C++命名空間using?namespace?std是什么意思

    namespace中文意思是命名空間或者叫名字空間,傳統(tǒng)的C++只有一個(gè)全局的namespace,下面這篇文章主要給大家介紹了關(guān)于C++命名空間using?namespace?std是什么意思的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • C++實(shí)現(xiàn)打印兩個(gè)有序鏈表公共部分的方法

    C++實(shí)現(xiàn)打印兩個(gè)有序鏈表公共部分的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)打印兩個(gè)有序鏈表公共部分的方法,涉及C++針對(duì)有序鏈表的簡(jiǎn)單遍歷、比較相關(guān)操作技巧,需要的朋友可以參考下
    2017-05-05
  • C++Node類Cartographer開始軌跡的處理深度詳解

    C++Node類Cartographer開始軌跡的處理深度詳解

    這篇文章主要介紹了C++Node類Cartographer開始軌跡的處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-03-03
  • C語言中的數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換

    C語言中的數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換

    這篇文章主要介紹了C語言中的數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • C++常見異常處理原理及代碼示例解析

    C++常見異常處理原理及代碼示例解析

    這篇文章主要介紹了C++常見異常處理原理及代碼示例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • c++打印封裝每次打印前面加上時(shí)間戳問題

    c++打印封裝每次打印前面加上時(shí)間戳問題

    這篇文章主要介紹了c++打印封裝每次打印前面加上時(shí)間戳問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 深入分析C++模板特化與偏特化

    深入分析C++模板特化與偏特化

    這篇文章主要介紹了C++模板特化與偏特化的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08

最新評(píng)論

玉环县| 长武县| 泊头市| 泰和县| 昌邑市| 穆棱市| 铁岭县| 商河县| 襄城县| 新郑市| 泰顺县| 中宁县| 托克逊县| 东辽县| 太仆寺旗| 井陉县| 黄梅县| 平顺县| 峨眉山市| 马尔康县| 磐石市| 遵义县| 闽清县| 镇巴县| 怀仁县| 宿迁市| 揭阳市| 平谷区| 宁安市| 金溪县| 福泉市| 松潘县| 隆子县| 旬阳县| 临猗县| 阜城县| 内丘县| 麦盖提县| 平山县| 深州市| 浮山县|