博客 / 詳情

返回

關鍵字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(表達式)用在模板中,限制模板中的類型,但是也不常用

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.