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

C++之異常處理詳解

 更新時間:2013年08月20日 09:46:55   作者:  
C++中處理異常的過程是這樣的:在執(zhí)行程序發(fā)生異常,可以不在本函數(shù)中處理,而是拋出一個錯誤信息,把它傳遞給上一級的函數(shù)來解決,上一級解決不了,再傳給其上一級,由其上一級處理

程序中的錯誤分為編譯時的錯誤和運行時的錯誤。編譯時的錯誤主要是語法錯誤,比如:句尾沒有加分號,括號不匹配,關鍵字錯誤等,這類錯誤比較容易修改,因為編譯系統(tǒng)會指出錯誤在第幾行,什么錯誤。而運行時的錯誤則不容易修改,因為其中的錯誤是不可預料的,或者可以預料但無法避免的,比如內(nèi)存空間不夠,或者在調(diào)用函數(shù)時,出現(xiàn)數(shù)組越界等錯誤。如果對于這些錯誤沒有采取有效的防范措施,那么往往會得不到正確的運行結果,程序不正常終止或嚴重的會出現(xiàn)死機現(xiàn)象。我們把程序運行時的錯誤統(tǒng)稱為異常,對異常處理稱為異常處理。C++中所提供的異常處理機制結構清晰,在一定程度上可以保證程序的健壯性。

C++中處理異常的過程是這樣的:在執(zhí)行程序發(fā)生異常,可以不在本函數(shù)中處理,而是拋出一個錯誤信息,把它傳遞給上一級的函數(shù)來解決,上一級解決不了,再傳給其上一級,由其上一級處理。如此逐級上傳,直到最高一級還無法處理的話,運行系統(tǒng)會自動調(diào)用系統(tǒng)函數(shù)terminate,由它調(diào)用abort終止程序。這樣的異常處理方法使得異常引發(fā)和處理機制分離,而不在同一個函數(shù)中處理。這使得底層函數(shù)只需要解決實際的任務,而不必過多考慮對異常的處理,而把異常處理的任務交給上一層函數(shù)去處理。

C++的異常處理機制有3部分組成:try(檢查),throw(拋出),catch(捕獲)。把需要檢查的語句放在try模塊中,檢查語句發(fā)生錯誤,throw拋出異常,發(fā)出錯誤信息,由catch來捕獲異常信息,并加以處理。一般throw拋出的異常要和catch所捕獲的異常類型所匹配。異常處理的一般格式為:

復制代碼 代碼如下:

  try
  {
    被檢查語句
    throw 異常
  }
  catch(異常類型1)
  {
    進行異常處理的語句1
  }
  catch(異常類型2)
  {
    進行異常處理的語句2
  }
  ...

下面我們用示例演示一下異常處理:
復制代碼 代碼如下:

#include "stdafx.h"
#include <iostream>
template <typename T>
T Div(T x,T y)
{
if(y==0)
throw y;//拋出異常
return x/y;
}
int main()
{
int x=5,y=0;
double x1=5.5,y1=0.0;
try
    {
//被檢查的語句
        std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;
        std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl;
    }
catch(int)//異常類型
    {
        std::cout<<"除數(shù)為0,計算錯誤!"<<std::endl;//異常處理語句
    }
catch(double)//異常類型
    {
        std::cout<<"除數(shù)為0.0,計算錯誤!"<<std::endl;//異常處理語句
    }
return0;
}

結果:

看了上述的示例代碼,也許有人會問,第二個雙精度類型的除法計算也應該拋出異常才對啊,在實際的運行過程中并非如此,其實該雙精度類型除法函數(shù)根本沒有被執(zhí)行過。以上程序的執(zhí)行規(guī)程為:調(diào)用函數(shù)Div(x,y)時發(fā)生異常,由函數(shù)Div中的語句"throw y"拋出異常,并不在往下執(zhí)行return x/y,接著catch捕獲int類型的異常并處理異常,最后直接執(zhí)行"return 0"。因此函數(shù)Div(x1,y1)和catch(double){}模塊根本沒有被執(zhí)行。如果,我們把y的值改為1,則結果就變成為:

如果在執(zhí)行try語句模塊時,沒有發(fā)生異常,則catch語句塊不起作用,流程轉到其后的語句繼續(xù)執(zhí)行。從上述兩個結果中可知第一次throw拋出的int類型所以找到處理該類型的catch,而第二次是拋出double類型所找到的是處理double類型的catch。

下面對異常處理補充幾點:(1)try和catch塊中必須要用花括號括起來,即使花括號內(nèi)只有一個語句也不能省略花括號;(2)try和catch必須成對出現(xiàn),一個try_catch結果中只能有一個try塊,但可以有多個catch塊,以便與不同的異常信息匹配;(3)如果在catch塊中沒有指定異常信息的類型,而用刪節(jié)號"...",則表示它可以捕獲任何類型的異常信息;(4)如果throw不包括任何表達式,表示它把當前正在處理的異常信息再次拋出,傳給其上一層的catch來處理;(5)C++中一旦拋出一個異常,如果程序沒有任何的捕獲,那么系統(tǒng)將會自動調(diào)用一個系統(tǒng)函數(shù)terminate,由它調(diào)用abort終止程序;

最后還是一樣,我將用一個示例來總結一下今天所講的內(nèi)容(開發(fā)工具:vs2010): 

復制代碼 代碼如下:

#include "stdafx.h"
#include <iostream>

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

int main()
{
int x=5,y=1;
double x1=5.5,y1=0.0;
try
    {
//被檢查的語句
        std::cout<<x<<"/"<<y<<"="<<Div(x,y)<<std::endl;
        std::cout<<x1<<"/"<<y1<<"="<<Div(x1,y1)<<std::endl;
    }
catch(...)//捕獲任意類型異常
    {
try
        {
            std::cout<<"任意類型異常!"<<std::endl;
throw;//拋出當前處理異常信息給上一層catch
        }
catch(int)//異常類型
        {
            std::cout<<"除數(shù)為0,計算錯誤!"<<std::endl;//異常處理語句
        }
catch(double)//異常類型
        {
            std::cout<<"除數(shù)為0.0,計算錯誤!"<<std::endl;//異常處理語句
        }

    }

return0;
}


結果:

相關文章

  • c++中for雙循環(huán)的那些事

    c++中for雙循環(huán)的那些事

    本人很菜,今天看《C++編程思想》中的一道課后題中說到這樣一個問題。修改兩層嵌套的for循環(huán)的標識符,觀察結果變化
    2013-05-05
  • C語言數(shù)據(jù)結構順序表中的增刪改(尾插尾刪)教程示例詳解

    C語言數(shù)據(jù)結構順序表中的增刪改(尾插尾刪)教程示例詳解

    這篇文章主要為大家介紹了C語言數(shù)據(jù)結構順序表中的增刪改教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • 用C++實現(xiàn)strcpy(),返回一個char*類型的深入分析

    用C++實現(xiàn)strcpy(),返回一個char*類型的深入分析

    本篇文章是對用C++實現(xiàn)strcpy(),返回一個char*類型進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • opencv3/C++圖像濾波實現(xiàn)方式

    opencv3/C++圖像濾波實現(xiàn)方式

    今天小編就為大家分享一篇opencv3/C++圖像濾波實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • string居然也可以用<<和>>

    string居然也可以用<<和>>

    今天小編就為大家分享一篇關于string居然也可以用<<和>>,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • C++中std::find函數(shù)介紹和使用場景

    C++中std::find函數(shù)介紹和使用場景

    std::find函數(shù)是一個非常實用的通用查找算法,適用于各種場景,本文主要介紹了C++中std::find函數(shù)介紹和使用場景,具有一定的參考價值,感興趣的可以了解一下
    2024-02-02
  • C語言字符串另類用法的實現(xiàn)

    C語言字符串另類用法的實現(xiàn)

    今天小編就為大家分享一篇關于C語言字符串另類用法的實現(xiàn),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • CMake中使用vcpkg的實現(xiàn)

    CMake中使用vcpkg的實現(xiàn)

    本文主要介紹了CMake中使用vcpkg的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • C++實現(xiàn)字符串類型相互轉換的代碼示例

    C++實現(xiàn)字符串類型相互轉換的代碼示例

    在C/C++編程中,字符串是非常基礎且常用的數(shù)據(jù)類型,但是由于不同的編程語言或標準庫可能采用不同的字符串類型,因此在不同的應用場景下可能需要進行字符串類型的相互轉換,本文將介紹如何在C/C++中將char*,std::string,QString,CString/MFC?String相互轉換
    2023-06-06
  • Qt之QTimer使用及技巧小結

    Qt之QTimer使用及技巧小結

    QTimer是Qt中的定時器類,用于執(zhí)行定時操作,如在一段時間間隔后觸發(fā)某個槽函數(shù)或執(zhí)行特定的代碼,下面就來介紹一下Qt之QTimer使用及技巧小結,感興趣的可以了解一下
    2023-10-10

最新評論

峡江县| 蒙山县| 修文县| 花莲县| 乾安县| 蒙城县| 南开区| 昌都县| 庄河市| 南宁市| 保德县| 辰溪县| 阿图什市| 岗巴县| 新田县| 壶关县| 察隅县| 海林市| 全州县| 江川县| 兴隆县| 闽侯县| 留坝县| 社会| 黑龙江省| 景洪市| 潞西市| 九江市| 准格尔旗| 万年县| 安义县| 丽水市| 左权县| 比如县| 洪湖市| 钟祥市| 安吉县| 陈巴尔虎旗| 东海县| 沙田区| 岑溪市|