异常throw&try/catch的使用

#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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值