#include "stdafx.h"
#include <iostream>
using namespace std;
#include <exception>
struct MyException : public exception
{
const char * what() const throw () //继承的虚函数,throw ()不抛出任何异常,异常信息函数不需要抛出
{
throw 1; //此处仍会抛出异常,但是函数声明throw(),在使用者使用时不加捕捉会出现奔溃,需要注意
return "MyException"; //抛出异常后会直接执行catch后代码,此处跳过
}
};
static double funcA(int a, int b) throw()
{
if (b == 0)
{
throw "ERRO!";
}
return (a / b);
}
//
//抛出异常没有捕捉处理会提示有未处理的异常的奔溃信息
//throw() 和 throw(...)函数声明时加上只是告诉外界内部异常不抛出或抛出任何类型,任何类型需要catch(...)捕捉,在函数内部有抛出点时,仍会抛出
//throw(int)告速编译器会抛出int异常,所以在使用处就需要设置catch(...)或者catch(int)
//throw和catch总是配对使用,抛出哪种异常就需要捕捉哪种
//
static double funcB(int a, int b) throw(int,char) //抛出int或char异常,如果函数内部抛出其他异常在catch处没有捕捉运行后续程序可能会奔溃
{
if (b == 0)
{
//throw 1;
//throw "1";
throw 1.1;
}
return (a / b);
}
static void run()
{
try
{
throw MyException(); //throw表达式的结果是抛出类型,此处是MyException对象
}
catch (std::exception& e) //此处捕捉到的是throw抛出来的东西,也是对象
{
//std::cout << e.what() << std::endl; //"MyException"虚函数多态,输出派生类异常信息
try
{
std::cout << e.what() << std::endl;
}
catch (...)
{
std::cout << "exception Erro!" << std::endl;
}
}
catch (...) //可以捕捉到任何异常,try后可以加不同的处理catch
{
//其他的错误
}
try
{
double a = funcA(1, 0);
}
catch (const char* erro) //捕捉到的是字符串
{
std::cerr << erro << endl; //"ERRO!"
}
try
{
double a = funcB(1, 0);
}
catch (double a) //捕捉到double异常
{
//std::cout << "ERROINT" << endl; //"ERROINT"
std::cout << a << endl; //"1.1"
}
}
int main()
{
run();
system("pause");
return 0;
}
异常throw&try/catch的使用
最新推荐文章于 2022-11-22 18:56:17 发布