C++ 异常小记

catch必定使用拷贝构造函数

如下代码编译不通过,因为拷贝构造被标记delete

#include <stdexcept>
#include <cstdlib>
#include <iostream>

using namespace std;

class sonExc : public exception {
public:
    sonExc ( const char* const msg ) : exception ( msg ) {

    }
    sonExc ( const sonExc & e ) = delete;
};


int main()
{
    try {
        sonExc e { "Hello" };
        throw e;
    }
    catch ( sonExc &e ) {
        cout << "sonExc:" << e.what() << endl;
    }
    catch ( exception &e ) {
        cout << "exception:" << e.what() << endl;
    }

    system ( "pause" );
}


throw 指针

依照优先匹配原则
可以匹配 基类指针、本类指针和void*,哪个在前面优先哪个

#include <stdexcept>
#include <cstdlib>
#include <iostream>

using namespace std;

class sonExc : public exception {
public:
    sonExc ( const char* const msg ) : exception ( msg ) {

    }
    sonExc ( const sonExc & e ) = delete;
};


int main()
{
    try {
        sonExc *e = new sonExc{ "Hello" };
        throw e;
    }
    catch ( int e ) {
        cout << "int *" << ( e ) << endl;
    }
    catch ( void* e ) {
        cout << "void *" << reinterpret_cast<int> ( e ) << endl;
    }
    catch ( sonExc *e ) {
        cout << "sonExc:" << e->what() << endl;
    }
    catch ( exception *e ) {
        cout << "exception:" << e->what() << endl;
    }

    system ( "pause" );
}


posted @ 2018-02-01 22:13  开学五年级了  阅读(113)  评论(0编辑  收藏  举报