关键字noexcept

c++中通过throw关键字抛出异常,通过try{}catch{}捕获异常,在对应函数后添加throw()指定可以抛出的异常类型

#include<iostream>
using namespace std;

struct MyException {
	MyException(string str) : msg(str) {}
	string msg;
};

void func() throw(int ,double,MyException){ 
	// throw(int, double, MyException)该函数只允许抛出指定类型的异常     windows中只警告,但是linux中报错 
	// 如果throw()  括号中什么都没有,就是这个函数不允许抛出异常    
	// 不写throw(...)是指这个函数可以抛出任意类型的异常
	try
	{
		//throw 1;
		throw MyException("string exception!");
	}
	catch (int e)
	{
		cout << "throw value: " << e << endl;
	}
	catch (MyException e) {
		cout << "Myexpection:" << e.msg << endl;
	}
}

int main() {
	func();
	system("pause");
	return 0;
}

就如上面代码中的例子:func()函数中抛出异常并且捕获,func被限制只能抛出int,double,MyException类型的异常。

throw(int, double, MyException)该函数只允许抛出指定类型的异常 在windows中只警告,但是linux中报错

如果throw() 括号中什么都没有,就是这个函数不允许抛出异常

不写throw(...)是指这个函数可以抛出任意类型的异常

C++11新增了noexcept关键字

#include<iostream>
using namespace std;

struct MyException {
	MyException(string str) : msg(str) {}
	string msg;
};

void func() noexcept(true){ 
	// 在c++11中使用noexcept代替throw()表示这个函数不允许抛出异常,需要抛出异常只需要去掉关键字noexcept即可
	// noexcept()关键字后面可以加括号,里面写表达式,如果表达式返回值为true:noexcept就有效,该函数不能向外抛异常;返回值为false:noexcept就无效,该函数就可以向外抛异常

		//throw 1;
		throw MyException("string exception!");
}

int main() {
	try
	{
		func();
	}
	catch (int e)
	{
		cout << "throw value: " << e << endl;
	}
	catch (MyException e) {
		cout << "Myexpection:" << e.msg << endl;
	}
	system("pause");
	return 0;
}

就如上面的例子:在函数func()后面添加noexcept限制该函数向外不能抛出异常

noexcept()关键字后面可以加括号,里面写表达式,如果表达式返回值为truenoexcept(true)就有效,该函数不能向外抛异常;返回值为falsenoexcept(false)就无效,该函数就可以向外抛异常。

不带括号的noexcept相当于noexcept(true),即不会抛出异常。

noexcept(表达式)用在模板中,限制模板中的类型,但是也不常用

原文链接:关键字noexcept

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容