C++異常處理與跟蹤調(diào)試

異常

  1. 程序的錯誤,一種是編譯錯誤,即語法錯誤 ,
  2. 另一種是在運(yùn)行時發(fā)生的錯誤
  • 不可預(yù)料的邏輯錯誤
- 邏輯錯誤是由于不當(dāng)?shù)脑O(shè)計(jì)造成的 
  • 可以預(yù)料的運(yùn)行異常
  • 運(yùn)行異常.可以預(yù)料,但不能避免,它是由系統(tǒng)運(yùn)行環(huán)境造成的。
  • 然而這些錯誤是能夠預(yù)料的,通常加入一些預(yù)防代碼便可防止這些異常
  1. 程序的錯誤,一種是編譯錯誤,即語法錯誤。另一種是運(yùn)行時發(fā)生的錯誤

異常的基本思想是

  1. 實(shí)際的資源分配(如內(nèi)存申請或文件打開)通常在程序的低層進(jìn)行
  2. 當(dāng)操作失敗、無法分配內(nèi)存或無法打開一個文件時, 在邏輯上如何進(jìn)行處理通常是在程序的高層
  3. 異常為從分配資源的代碼轉(zhuǎn)向處理錯誤狀態(tài)的代碼提供了—種表達(dá)方式。如果還存在中間層次的函數(shù),則為它們釋放所分配的內(nèi)存提供了機(jī)會,但這并不包括用于傳遞錯誤狀態(tài)信息的代碼。
  • 拋擲異常的程序段
......
throw    表達(dá)式;
......

  • 捕獲并處理異常的程序段
try 
   復(fù)合語句
catch(異常類型聲明)
    復(fù)合語句
catch(異常類型聲明)
    復(fù)合語句
    …

異常處理的目的

  • 在異常發(fā)生時盡可能的減小破壞,周密的善后,而不去影響其他部分程序的運(yùn)行。這在大型的程序中是非常必要的。如上例中調(diào)用的關(guān)系,異常只能在發(fā)生的函數(shù) k() 中進(jìn)行處理,無法傳遞到 f() 中,而且調(diào)用鏈中的函數(shù) g()的善后處理液十分困難。這時就可以使用 c++ 異常機(jī)制來處理

編寫異常處理程序的規(guī)則是

  1. 定義異常(try語句塊)將那些有可能產(chǎn)生錯誤的語句框定在try塊中
  2. 若有異常則通過throw操作創(chuàng)建一個異常對象并拋擲。
  3. 定義異常處理catch語句塊,將異常處理的語句放在catch塊內(nèi),以便異常被傳遞過來時處理它
  4. 任意數(shù)量的catch分程序立即出現(xiàn)在try分程序之后。
  5. 在catch行的圓括號中可包含數(shù)據(jù)類型聲明
  6. 如果一個函數(shù)拋擲一個異常,但在通往異常處理函數(shù)的調(diào)用鏈中找不到與之匹配的catch,則該程序通常以abort()函數(shù)調(diào)用終止

編寫異常注意事項(xiàng)

  1. try語句塊中包含的是有可能發(fā)生異常的語句,c++只理會受監(jiān)控的過程的異常
  2. catch()括號中的聲明只能容納一個形參,當(dāng)類型與拋出的異常類型匹配時,該catch( ) 塊便能捕獲一個異常
  3. 在 catch()的括號內(nèi)可以包含數(shù)據(jù)類型聲明, 他與函數(shù)定義中的聲明起的作用相同
  4. 執(zhí)行完catch()中的內(nèi)容,若異常處理后還有代碼的話,則會接著執(zhí)行

派生類的異常捕獲:

  1. 異常捕獲的規(guī)則除了前面所說的,必須嚴(yán)格匹配數(shù)據(jù)類型外,對于類的派生,下列情況 >- 可以捕獲異常:
  • 異常處理的數(shù)據(jù)類型是公有基類,拋擲異常的數(shù)據(jù)類型是派生類
  • 異常處理的數(shù)據(jù)類型是指向公有基類的指針, 拋擲異常的數(shù)據(jù)類型是指向派生類的指針。

對于派生層次結(jié)構(gòu)的異常處理, >1. catch塊組中的順序是重要的。因?yàn)椤癱atch(基類)”總能夠捕獲“throw 派生類對象”。所以“catch(基類)”塊總是放在"catch(派生類)"塊的后面,以避免"catch(派生類)"永遠(yuǎn)不能捕獲異常


#include <iostream>
using namespace std;
int main()
{
    int n=1;
    try
    {
        int *p=new int;
        cout<<"begin"<<endl;
        if(n==1)
            throw 1;
        cout<<"after"<<endl;
    }
    catch(int)
    {
        cout<<"catch"<<endl;
        cout<<"end"<<endl;
    }
}
/*
begin
catch
end
*/
  • 異常與類的關(guān)系
#include <iostream>
using namespace std;
class test
{
    public:
        int m_z;
};
int main()
{
    int n=1;
    try
    {
        int *p=new int;
        cout<<"begin"<<endl;
        test t1;
        t1.m_z=100;
        if(n==1)
            throw t1;
        cout<<"after"<<endl;
    }
    catch(test t2)
    {
        cout<<"catch"<<t2.m_z<<endl;
    
    }
    cout<<"end"<<endl;
}
/*
begin
catch100
end
*/
  • 進(jìn)化版
#include <iostream>
using namespace std;
class test
{
    public:
        int m_z;
};
int main()
{
    int n=1;
    try
    {
        try
        {
            cout<<"begin"<<endl;
            test t1;
            t1.m_z=100;
            if(n==1)
                throw t1;
            cout<<"after"<<endl;
        }   
        catch(int)
        {
            cout<<"int catch"<<endl;
        }
    }
    catch(test t2)
    {
        cout<<"catch"<<t2.m_z<<endl;
    }
    catch(...)
    {
        cout<<"..."<<endl;
    }
    cout<<"end"<<endl;
}
/*
begin
catch100
end
*/
//throw 123;
/*
begin
int catch
end

*/
//throw 'a'
/*
begin
...
end

*/
#include<iostream>
#include<vector>
using namespace std;
class zyz
{
    public:
        int m_z;
};
int main()
{
    int n=1;
    try
    {
        cout<<"begin"<<endl;
        zyz z1;
        z1.m_z=100;
        if(n==1)
        {
            throw z1;
        }
        cout<<"after"<<endl;
    }
    catch(zyz z2)
    {
        cout<<"catch"<<z2.m_z<<endl;
    }
    cout<<"end"<<endl;
    return 0;
}
//結(jié)果為:
//begin
//catch100
//end

安裝mysql

  1. 安裝mysql服務(wù)器
  • sudo apt-get install mysql-server
  1. 安裝圖形開發(fā)界面
  • sudo apt-get install mysql-workbench
  1. 安裝mysql開發(fā)包
  • sudo apt-get install libmysql
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容