例外処理の1つ

3123 ワード

1,ローカルオブジェクトのクリーンアップ.

#include <iostream>
using namespace std;

class A
{
public:
    A(){ cout<<"A()"<<endl; }
    ~A(){ cout<<"~A()"<<endl; }
};
void func()
{
    A a;
    cout<<"throw int exception."<<endl;
    throw 43;//" ", a.
    cout<<"throw "<<endl;
}
int main()
{
    try{
        cout<<"try block!"<<endl;
        func();
    }
    catch(int)
    {
        cout<<"exception handler!"<<endl;
    }

    return 0;
}

2、異常照合

#include <iostream>
using namespace std;

class Except1{};
class Except2
{
public:
    Except2(const Except1&){};
};
void func()
{
    throw Except1();
}
int main()
{
    try{
        func();
    }
    catch(Except2&) // 
    {
        cout<<"catch Except2."<<endl;
    }
    catch(Except1&) // 
    // " "; .
    {
        cout<<"catch Except1."<<endl;
    }

    return 0;
}

3.terminate呼び出しを誘発する3つの状況:
(1)1つの異常タイプはいずれの文脈階層の異常プロセッサにも捕捉されていない.
termindate()関数をカスタマイズします.

#include <iostream>
using namespace std;

void my_terminate() // termindate() 
{
    cout<<"without catching exception."<<endl;
    exit(0);
}

// terminate() , .
void (*old_terminate)()=set_terminate(my_terminate);

void func(){ throw 43; }

int main()
{
    func(); // 
    // terminate() .
    return 0;
}

(2)「ヒープの逆解」の過程で、局部のオブジェクトの構造関数は異常を投げ出した.

#include <iostream>
using namespace std;

class A
{
public:
    ~A(){ throw 43; }
};
void func()
{
    A a;
    cout<<"throw int exception."<<endl;
    throw 43;//" ", a.
}
int main()
{
    try{
        func(); // a ,a .
                // terminate() 
    }
    catch(int)
    {
        cout<<"exception handler!"<<endl;
    }
    
    return 0;
}

(3)グローバルオブジェクトまたは静的オブジェクトのコンストラクション関数または解析関数に異常が投げ出す.

#include <iostream>
using namespace std;

class A
{
public:
    //A(){ throw 23; } // .
    ~A(){throw 23; }
};
//A a; // , terminate() .
int main()
{
    try{
        static A a;// , terminate() .
    }
    catch(int)
    {
        cout<<"handle int exception."<<endl;
    }
    return 0;
}