自定义类型异常
#include <iostream>
#include <string>
using namespace std;
class MyException
{
public:
MyException(const char *message) : message_(message)
{
cout << "MyException..." << endl;
}
MyException(const MyException& other) : message_(other.message_)
{
cout << "Copy MyException..." << endl;
}
~MyException()
{
cout << "~MyException..." << endl;
}
const char* what() const
{
return message_.c_str();
}
private:
string message_;
};
double Divide(double a, double b)
{
if (b == 0.0)
{
MyException e("division by zero");
throw e;
}
else
{
return a / b;
}
}
int main()
{
try
{
cout << Divide(5.0, 0.0) << endl;
}
catch(MyException &e)
{
cout << e.what() << endl;
}
return 0;
}
异常捕获
异常处理器的参数类型和抛出异常的类型应保持相同。
...表示可以捕获任意异常。
#include <iostream>
#include <string>
using namespace std;
class MyException
{
public:
MyException(const char *message) : message_(message)
{
cout << "MyException..." << endl;
}
MyException(const MyException& other) : message_(other.message_)
{
cout << "Copy MyException..." << endl;
}
~MyException()
{
cout << "~MyException..." << endl;
}
const char* what() const
{
return message_.c_str();
}
private:
string message_;
};
double Divide(double a, double b)
{
if (b == 0.0)
{
/*MyException e("division by zero");
throw e;*/
throw 1; // xxx error
}
else
{
return a / b;
}
}
int main()
{
try
{
cout << Divide(5.0, 0.0) << endl;
}
catch(MyException &e)
{
cout << e.what() << endl;
}
return 0;
}
注意问题
运行结果并没有调用拷贝构造函数。
#include <iostream>
#include <string>
using namespace std;
class MyException
{
public:
MyException(const char *message) : message_(message)
{
cout << "MyException..." << endl;
}
MyException(const MyException& other) : message_(other.message_)
{
cout << "Copy MyException..." << endl;
}
~MyException()
{
cout << "~MyException..." << endl;
}
const char* what() const
{
return message_.c_str();
}
private:
string message_;
};
double Divide(double a, double b)
{
if (b == 0.0)
{
throw MyException("division by zero");
}
else
{
return a / b;
}
}
int main()
{
try
{
cout << Divide(5.0, 0.0) << endl;
}
catch (MyException &e)
{
cout << e.what() << endl;
}
catch (...)
{
cout << "catch a exception" << endl;
}
return 0;
}
类比
#include <iostream>
#include <string>
using namespace std;
class Test
{
public:
Test()
{
cout << "Test..." << endl;
}
Test(const Test& other)
{
cout << "Copy Test..." << endl;
}
~Test()
{
cout << "~Test..." << endl;
}
};
Test func()
{
Test t;
return t;
}
int main()
{
func();
cout << "......" << endl;
return 0;
}
如下也并没有调用拷贝构造函数。
#include <iostream>
#include <string>
using namespace std;
class Test
{
public:
Test()
{
cout << "Test..." << endl;
}
Test(const Test& other)
{
cout << "Copy Test..." << endl;
}
~Test()
{
cout << "~Test..." << endl;
}
};
Test func()
{
//Test t;
//return t;
return Test(); // xxx
}
int main()
{
func();
cout << "......" << endl;
return 0;
}