欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++之異常處理詳解

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

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

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

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

復(fù)制代碼 代碼如下:

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

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

#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,計(jì)算錯(cuò)誤!"<<std::endl;//異常處理語句
    }
catch(double)//異常類型
    {
        std::cout<<"除數(shù)為0.0,計(jì)算錯(cuò)誤!"<<std::endl;//異常處理語句
    }
return0;
}

結(jié)果:

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

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

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

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

復(fù)制代碼 代碼如下:

#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;//拋出當(dāng)前處理異常信息給上一層catch
        }
catch(int)//異常類型
        {
            std::cout<<"除數(shù)為0,計(jì)算錯(cuò)誤!"<<std::endl;//異常處理語句
        }
catch(double)//異常類型
        {
            std::cout<<"除數(shù)為0.0,計(jì)算錯(cuò)誤!"<<std::endl;//異常處理語句
        }

    }

return0;
}


結(jié)果:

相關(guān)文章

  • 使用c++實(shí)現(xiàn)OpenCV圖像橫向&縱向拼接

    使用c++實(shí)現(xiàn)OpenCV圖像橫向&縱向拼接

    這篇文章主要介紹了使用c++實(shí)現(xiàn)OpenCV圖像橫向&縱向拼接,文中有圖像拼接函數(shù),可以實(shí)現(xiàn)如“長圖拼接王”這類小程序的類似功能,大家可以將該函數(shù)封裝在軟件中自由使用
    2021-08-08
  • C++ OpenCV實(shí)現(xiàn)圖像去水印功能

    C++ OpenCV實(shí)現(xiàn)圖像去水印功能

    本文將介紹如何使用OpenCV C++ 進(jìn)行簡單圖像水印去除。我們在網(wǎng)上download圖片時(shí),經(jīng)常因?yàn)榘鏅?quán)問題有水印。本案例通過編寫算法進(jìn)行簡單水印去除。需要的可以參考一下
    2022-01-01
  • C與C++ 無參函數(shù)的區(qū)別解析

    C與C++ 無參函數(shù)的區(qū)別解析

    在《C++ 編程思想》:“關(guān)于無參函數(shù)聲明,C與C++有很大的差別。在C語言中,聲明int fun1(),意味著一個(gè)可以有任意數(shù)目和類型的函數(shù);而在C++中,指的卻是一個(gè)沒有參數(shù)的函數(shù)”
    2013-07-07
  • C語言小項(xiàng)目計(jì)時(shí)器的實(shí)現(xiàn)思路(倒計(jì)時(shí)+報(bào)警提示)

    C語言小項(xiàng)目計(jì)時(shí)器的實(shí)現(xiàn)思路(倒計(jì)時(shí)+報(bào)警提示)

    這篇文章主要介紹了C語言小項(xiàng)目計(jì)時(shí)器(倒計(jì)時(shí)+報(bào)警提示)的實(shí)現(xiàn)思路,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • 實(shí)例代碼分析c++動(dòng)態(tài)分配

    實(shí)例代碼分析c++動(dòng)態(tài)分配

    這篇文章主要介紹了c++動(dòng)態(tài)分配的的相關(guān)資料,文中代碼簡單易懂,方便大家更好的學(xué)習(xí)參考,感興趣的朋友可以了解下
    2020-06-06
  • 五個(gè)嵌入式C語言中的實(shí)用技巧分享

    五個(gè)嵌入式C語言中的實(shí)用技巧分享

    這篇文章主要和大家分享一下五個(gè)嵌入式C語言中的實(shí)用技巧,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C語言有一定的幫助,需要的可以參考一下
    2022-12-12
  • C語言lseek()函數(shù)詳解

    C語言lseek()函數(shù)詳解

    這篇文章主要介紹了C語言lseek()函數(shù)詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 交換兩個(gè)文本內(nèi)容的C語言代碼

    交換兩個(gè)文本內(nèi)容的C語言代碼

    這篇文章主要介紹了交換兩個(gè)文本內(nèi)容的C語言代碼,有需要的朋友可以參考一下
    2013-12-12
  • 利用C++實(shí)現(xiàn)雙鏈表基本接口示例代碼

    利用C++實(shí)現(xiàn)雙鏈表基本接口示例代碼

    雙鏈表:在單鏈表的每個(gè)結(jié)點(diǎn)中,再設(shè)置一個(gè)指向其前驅(qū)結(jié)點(diǎn)的指針域,下面這篇文章主要給大家介紹了關(guān)于利用C++實(shí)現(xiàn)雙鏈表基本接口的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-08-08
  • 如何使用遞歸和非遞歸方式反轉(zhuǎn)單向鏈表

    如何使用遞歸和非遞歸方式反轉(zhuǎn)單向鏈表

    以下是對使用遞歸和非遞歸方式反轉(zhuǎn)單向鏈表的示例進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下
    2013-07-07

最新評論