1 c++可以抛出各种类型的异常,若要自己抛出,还是推荐继承exception类,重载what函数。 不推荐像我这样抛出 int float等。
2 抛出异常的函数 最好写上抛出异常声明,throw() ,括号里写抛出类型,不写throw表示可能抛出任何类型异常,空括号表示不抛
3 throw的异常只能由其try对应的catch捕获。若没捕获则抛给上层函数来捕获,catch中抛出的也会交给上层catch捕获。
若异常抛给内核则出错,所以一般main中写catch(...)来捕获任何异常。
4 捕获异常后函数无法恢复,会跳到catch后面的语句执行。
5 抛出的异常可能是个临时变量,会等到异常处理完毕后销毁。
#include <iostream>
#include <exception>
#include <cstdio>
using namespace std;
class MyType {};
//抛异常时最好自定义异常类型 继承exception类 重写what函数
class MyException : public exception
{
public:
//用来报错时显示异常信息
const char* what() const throw()
{
return "我的异常";
}
};
class ME : public exception
{
char msg[100];
public:
ME(int n)
{
sprintf(msg,"在第%d行捕获到异常",n);
}
const char* what() const throw()
{
return msg;
}
};
void f() throw(MyException,int,double,const char*,MyType) //异常声明,可能抛出的异常类型。不声明就一切都有可能。 空括号表示不会抛出异常
{
cout << "请输入一个整数 1- 5" << endl;
int n;
cin >> n;
if(n == 1) throw MyException(); // 异常即使是个临时对象 也会保留到被处理后才释放
if(n ==2 ) throw MyType();
if(n == 3) throw "hello";
if( n == 4) throw 123;
if(n == 5) throw 123.45;
cout << "-------------the end of f() ----------------" <<endl; //抛出异常时 这个不会执行
}
void g()
{
try
{
f();
cout << "the end of g()" << endl;
}
//异常是不可恢复的 一旦出现异常 会执行相应catch语句 跳过不符合的catch
//然后往catch后面执行
//抛出的异常如果没捕获,程序运行出错终止
catch(const char* e){ cout << "const char *" << e << endl;} //字符串常量
catch(double e) { cout << "double " << e << endl; throw;}//再次抛出 不会执行endof g()
catch(MyException &e) {cout << e.what() << endl; }
catch(exception &e) {cout << e.what() << endl;} //标准库里抛出的异常类型都是exception的子类
//尽量保证自定义的异常 继承自exception
//捕获任意异常,如果用catch(...)一定是最后一个
//catch(...){cout << "g()其他异常" << endl;throw ME(__LINE__);} //throw;表示将当前异常重新抛出
//__LINE__ 行号
//每个catch 只处理它对应的try() 不能处理同级的catch抛出的异常
//没有捕获的异常向上层传
}
int main()
{
try
{
g();
}
//异常是不可恢复的 一旦出现异常 会执行相应catch语句 跳过不符合的catch
//然后往catch后面执行
//抛出的异常如果没捕获,程序运行出错终止
catch(const char* e){ cout << "const char *" << e << endl;} //字符串常量
catch(double e) { cout << "double " << e << endl;}
catch(MyException &e) {cout << e.what() << endl; }
catch(exception &e) {cout << e.what() << endl;} //标准库里抛出的异常类型都是exception的子类
//尽量保证自定义的异常 继承自exception
//捕获任意异常,如果用catch(...)一定是最后一个 main函数中一般用一个catch(...) 不往内核抛
//
catch(...){cout << "main其他异常" << endl;}
cout << "-------------the end of main() ----------------" <<endl;
}