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

C++ 中的異常拋出和捕獲方式

 更新時(shí)間:2022年07月25日 09:33:49   作者:止步聽風(fēng)  
這篇文章主要介紹了C++ 中的異常拋出和捕獲方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

在 C 語言中,如果發(fā)生錯(cuò)誤,上級函數(shù)要進(jìn)行出錯(cuò)處理,層層上傳,容易造成過多的出錯(cuò)處理代碼,并且傳遞的效率比較低下。

C++ 中的異常

C++ 中,異常的引發(fā)和異常的處理不必處于同一個(gè)函數(shù)中,因此底層函數(shù)可以著重于解決具體問題,而不必過多的考慮異常處理

異常是專門針對抽象編程中的一系列錯(cuò)誤處理的,遇到錯(cuò)誤信息就轉(zhuǎn)到若干級之上進(jìn)行重新嘗試

異常脫離于函數(shù)機(jī)制,決定了其對函數(shù)的跨越式回跳

語法

try
{
? ? statement;
}
catch(ExceptionType var)
{
? ? statement;
}

被檢測的語句放在 try 塊中

try catch 語句中的花括號是語法的一部分,不能省略

try-catch 結(jié)構(gòu)中,只能有一個(gè) try 塊,catch 塊可以有多個(gè),以便與不同的類型信息匹配,有點(diǎn)類似于 switch-case 結(jié)構(gòu)

利用 throw 拋出的異常類型,可以傳遞系統(tǒng)預(yù)定義的標(biāo)準(zhǔn)類型或自定義類型

從 throw 拋出異常,到 catch 捕獲異常,有點(diǎn)類似與利用函數(shù)的返回值進(jìn)行復(fù)制一樣,因此如果使用了自定義類型,需要考慮自定義類型的賦值和拷貝問題

如果 catch 語句沒有與之相匹配的異常類型信息,可以用(...)表示可以捕獲任何異常類型的信息,有點(diǎn)類似與 switch-case 結(jié)構(gòu)中的 default

try-catch 結(jié)構(gòu)可以與 throw 在同一函數(shù)中,也可以不在同一個(gè)函數(shù)中,throw 拋出異常后,會先在本函數(shù)中尋找與之相匹配的 catch 塊,如果沒有與之相匹配的 catch,就可以轉(zhuǎn)到上一層 try-catch,如果仍然沒有

匹配到,則轉(zhuǎn)到再上一層 try-catch...,如果最終到不到與之匹配的 try-catch 塊,系統(tǒng)就會調(diào)用系統(tǒng)函數(shù),terminal 使程序終止

#include <iostream>
?
using namespace std;
?
void func1()
{
? ? double a;
? ? try{
? ? ? ? throw a;
? ? }catch(double)
? ? {
? ? ? ? cout<<"catch func1()"<<endl; //throw
? ? }
? ? cout<<"end func1()"<<endl;
? ? return ;
}
?
void func2()
{
? ? try{
? ? ? ? func1();
? ? }catch(int)
? ? {
? ? ? ? cout<<"catch func2()"<<endl;
? ? }
? ? cout<<"end func2()"<<endl;
}
?
void func3()
{
? ? try{
? ? ? ? func2();
? ? }catch(char)
? ? {
? ? ? ? cout<<"catch func3()"<<endl;
? ? }
? ? cout<<"end func3()"<<endl;
}
?
int main()
{
? ? try{
? ? ? ? func3();
? ? }catch(double)
? ? {
? ? ? ? cout<<"catch main"<<endl;
? ? }
? ? cout<<"end main"<<endl;
? ? return 0;
}

結(jié)果為:

catch func1()
end func1()
end func2()
end func3()
end main

上邊的異常傳遞路線為 func3->func2()->func1(),在 func1 中找到對應(yīng)的 catch 塊,然后執(zhí)行對應(yīng) catch 塊中的語句,輸出:

catch func1()

整個(gè)的異常處理已經(jīng)結(jié)束,跳出 func1() 的 try-catch 塊,繼續(xù)執(zhí)行 func1() 的函數(shù)體,陸續(xù)輸出:

end func1()
end func2()
end func3()
end main

此時(shí)進(jìn)程結(jié)束。

如果將 func1() 中的 catch 到的異常類型換個(gè)類型,如:

catch(void *)

結(jié)果為:

catch main
end main

則會在 func1(),func2(),func3() 中都找不到對應(yīng)的 catch 匹配,直到 main 函數(shù)才能找到對應(yīng)的匹配,然后輸出:

catch main
end main

如果將 main 函數(shù)中的 catch 捕獲類型也修改為:

catch(void *)

結(jié)果為:

terminate called after throwing an instance of 'double'
 
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

此時(shí)系統(tǒng)就會調(diào)用系統(tǒng)函數(shù),使程序終止。

拋出類型聲明

為了增強(qiáng)程序的可讀性,可以在函數(shù)聲明時(shí)就列出所有可能拋出的異常類型

void func() throw (A,B,C); ? ? // 表明該函數(shù)只會拋出 A,B,C 及其子類型的異常

如果在函數(shù)聲明時(shí)沒有聲明可能拋出的異常類型,則函數(shù)可以拋出任意類型的異常

不拋出任何類型異常的函數(shù),可以聲明為:

void func() throw();

如果一個(gè)函數(shù)拋出了拋出類型聲明中所不允許的異常,unexpected 函數(shù)被調(diào)用,啟用 terminal 函數(shù)中止程序

棧自旋

異常被拋出后,從進(jìn)入 try 塊起,到異常被拋擲前,這期間在棧上的構(gòu)造的所有對象,都會被自動析構(gòu)

析構(gòu)的順序與構(gòu)造的順序相反。這一過程稱為棧的解旋

而堆上的空間,則會泄漏

#include <iostream>
?
using namespace std;
?
class A
{
public:
? ? A(){ cout<<"A()"<<endl; }
? ? ~A(){ cout<<"~A()"<<endl; }
};
?
int func1()
{
? ? A a;
? ? if(1)
? ? ? ? throw('a');
? ? return 0;
}
?
int func2()
{
? ? A b;
? ? func1();
? ? return 1;
}
?
int main()
{
? ? try{
? ? ? ? func2();
? ? }catch(int x){
? ? ? ? cout<<"x"<<endl;
? ? }catch(double y){
? ? ? ? cout<<"y"<<endl;
? ? }catch(...){
? ? ? ? cout<<"no x, no y"<<endl;
? ? }
? ? return 0;
}

結(jié)果為:

A()
A()
~A()
~A()
no x, no y

如果 throw 的是一個(gè)類對象:

#include <iostream>
?
using namespace std;
?
class A
{
public:
? ? A(){ cout<<"A()"<<endl; }
? ? A(const A &obj){ cout<<"A(const A &obj)"<<endl; }
? ? ~A(){ cout<<"~A()"<<endl; }
};
?
int func1()
{
? ? A a;
? ? if(1)
? ? ? ? throw(a);
? ? return 0;
}
?
int func2()
{
? ? func1();
? ? return 1;
}
?
int main()
{
? ? try{
? ? ? ? func2();
? ? }catch(int x){
? ? ? ? cout<<"x"<<endl;
? ? }catch(double y){
? ? ? ? cout<<"y"<<endl;
? ? }catch(const A &a){
? ? ? ? cout<<"no x, no y"<<endl;
? ? }
? ? return 0;
}

結(jié)果為:

A()
A(const A &obj)
~A()
no x, no y
~A()

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++中的頭文件與Extern(外部函數(shù)調(diào)用)方式

    C++中的頭文件與Extern(外部函數(shù)調(diào)用)方式

    這篇文章主要介紹了C++中的頭文件與Extern(外部函數(shù)調(diào)用)方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C程序?qū)崿F(xiàn)整數(shù)的素?cái)?shù)和分解問題

    C程序?qū)崿F(xiàn)整數(shù)的素?cái)?shù)和分解問題

    這篇文章主要介紹了C程序?qū)崿F(xiàn)整數(shù)的素?cái)?shù)和分解問題,對于算法的學(xué)習(xí)有不錯(cuò)的借鑒價(jià)值,需要的朋友可以參考下
    2014-09-09
  • C++讀取帶空格字符串的方法

    C++讀取帶空格字符串的方法

    今天小編就為大家分享一篇C++讀取帶空格字符串的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 詳解C++ const修飾符

    詳解C++ const修飾符

    const 是 constant 的縮寫,const可以幫我們避免無意之中的錯(cuò)誤操作,本文給大家介紹C++ const修飾符的相關(guān)知識,通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-05-05
  • C++實(shí)現(xiàn)簡易通訊錄管理系統(tǒng)

    C++實(shí)現(xiàn)簡易通訊錄管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡易通訊錄管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 深入淺析C語言與C++的區(qū)別與聯(lián)系

    深入淺析C語言與C++的區(qū)別與聯(lián)系

    這篇文章主要為大家介紹了深入的分析了C語言與C++的區(qū)別與聯(lián)系,文中通過詳細(xì)的示例進(jìn)行了對比,以便大家更容易的看懂理解,有需要的朋友可以借鑒參考下
    2021-11-11
  • 詳解C++中的數(shù)據(jù)抽象

    詳解C++中的數(shù)據(jù)抽象

    這篇文章主要介紹了詳解C++中的數(shù)據(jù)抽象,數(shù)據(jù)抽象是指,只向外界提供關(guān)鍵信息,并隱藏其后臺的實(shí)現(xiàn)細(xì)節(jié),即只表現(xiàn)必要的信息而不呈現(xiàn)細(xì)節(jié),需要的朋友可以參考下
    2023-05-05
  • C或C++報(bào)錯(cuò):ld returned 1 exit status報(bào)錯(cuò)的原因及解決方法

    C或C++報(bào)錯(cuò):ld returned 1 exit status報(bào)錯(cuò)的原因及解

    這篇文章主要介紹了C或C++報(bào)錯(cuò):ld returned 1 exit status報(bào)錯(cuò)的原因及解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • Windows上CLion的配置步驟詳解

    Windows上CLion的配置步驟詳解

    這篇文章主要介紹了Windows上CLion的配置,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 超詳細(xì)解析C++實(shí)現(xiàn)歸并排序算法

    超詳細(xì)解析C++實(shí)現(xiàn)歸并排序算法

    歸并排序是比較穩(wěn)定的排序方法。它的基本思想是把待排序的元素分解成兩個(gè)規(guī)模大致相等的子序列。本文將用C++實(shí)現(xiàn)這一排序算法,需要的可以參考一下
    2022-09-09

最新評論

佛学| 中阳县| 略阳县| 廉江市| 称多县| 上高县| 丹东市| 黑河市| 甘南县| 静海县| 白沙| 张掖市| 修文县| 台前县| 资兴市| 南康市| 郸城县| 铅山县| 时尚| 武汉市| 临高县| 巴彦县| 伊川县| 綦江县| 黑龙江省| 顺义区| 长顺县| 永平县| 东辽县| 台湾省| 寿阳县| 铜陵市| 淮滨县| 青川县| 曲周县| 高清| 体育| 满城县| 庆城县| 江津市| 汉中市|