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()關鍵字後面可以加括號,裏面寫表達式,如果表達式返回值為true:noexcept(true)就有效,該函數不能向外拋異常;返回值為false:noexcept(false)就無效,該函數就可以向外拋異常。
不帶括號的noexcept相當於noexcept(true),即不會拋出異常。
noexcept(表達式)用在模板中,限制模板中的類型,但是也不常用