noexcept()函数
bool f = noexcept( func());
判断, func()
函数, 是否有标记noexcept
base
throw
是: 抛出一个 (对象)
你写: throw 123;
throw Foo();
都正确;
void func(){
111
throw Foo();
222
}
一旦throw Foo()
执行, 整个函数提前结束 即, 111里所有数据, 栈数据 回溯回收
(就和你调用return一个效果)
由于throw一个什么东西都可以, 所以, 你必须使用一个特殊的语法 来接收 这个(任意对象)
即: try{} catch( ?? ){} catch( ??){}
语法
一个try, 可以有多个catch, catch(...){} 表示接收任意
void func(){
T t0;
if( true){
throw Foo();
}
T t1;
return;
}
try{
func();
}
catch( const Foo & _d){
cout << "yes, receive the exception";
}
catch( ...){ ' 注意这个特殊的写法: catch(...){} '
cout << "other exception";
}
上述执行:
- 输出:
"yes, receive the exception";
t0
的构造和析构; t1
不会构造出来
你的抛出异常, 必须是在try(){}
代码块内;
这并不意味着: 你的throw代码 要在 try代码里; 比如上面中, throw在func函数里, 而func函数里 并没有try语句
但是, func函数 是在 try语句里的;
抛出的异常, 必须是在try
里, 而且, 必须有catch
接收住他;
否则, 两者有一不成立, 则导致: assert
的发生 (整个程序结束)
即, 异常其实是很危险的操作!!! 你必须用try和catch
来处理, 否则, 整个程序就退出了
int main(){
throw 123;
}
int main(){
try{
throw 123;
}
catch( string & s){} ' 不匹配 '
}
以上两个代码, 都是错误的 对 抛出异常的 使用;
程序会中途结束: terminate called after throwing an instance of 'xxx
所有stl里 抛出的异常, 这个对象, 他的根父类是std::exception
class exception{
public:
exception() noexcept{}
virtual ~exception() noexcept;
virtual const char* what() const noexcept; ' 这个异常的名称; '
};
示例
try {
throw exception(); ' 构造一个对象 '
} catch ( exception & _e) {
cout << _e.what() << endl;
}
会输出: std::exception
自定义异常类
class my_exception : public exception{
public:
my_exception(){}
const char * what() const noexcept;
};
const char * my_exception::what() const noexcept{
return "my_exception";
}
int main(){
try {
throw my_exception();
} catch ( exception & _e) {
cout << _e.what() << endl;
}
}
会输出: my_exception
这里用到了: 多态
从my_exception这个对象
到 exception &
, 这里就是 多态
(多态: )
noexcept 和 throw
void func(){ ...}
这种写法, 等价于: void func() noexcept( false){ ...}
; 写noexcept( false), 等价于不写
对于: void func noexcept( true){ ...}
(写noexcept( true), 等价于 noexcept)
此时, 你的...
里 就不可以有throw
这个操作
在函数声明, 使用throw( types...)
, 可以指定: 这个函数里, 所有的throw的类型
void func() throw( int, double){
throw "abc";
}
此时, 执行函数, 由于"abc" 不是int, 也不是double, 所以, 程序会调用: unexpected
(不期望的) 程序会死掉
但是, 这种写法: void func() throw( a, b, ...){}
在c++11往后, 就deprecated了!!!
因为: 这种写法 是静态写法, 而c++的异常处理, 是rtti动态的
dynamic exception specifications 动态异常机制
catch时, 对异常类型的匹配, 是通过RTTI动态解析的;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)