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" );
}