isnullxbh Asked:2020-08-06 18:47:04 +0000 UTC2020-08-06 18:47:04 +0000 UTC 2020-08-06 18:47:04 +0000 UTC 处理函数签名中指定的异常 772 有没有办法让编译器(g ++)在使用类似的函数时对未处理的异常(可能是某种标志)发誓 void f() throw (std::logic_error) {...} ? Upd.:不相关,因为此构造被标记为已弃用 感谢@ixSci 的评论 UPD。 https://habr.com/post/430690/ c++ 2 个回答 Voted Best Answer AlexGlebe 2020-08-06T19:45:04Z2020-08-06T19:45:04Z 您会期望出现错误,并且按类型分类的异常逻辑仅用于过滤。一个函数处理一些错误,其他一些更高的错误 - 以不同的方式犁地。这个例子展示了如何对不同的异常进行排序。您希望在这里发出错误不是主题。 # include <iostream> void g()throw(int){ std::cout<<"g:throwing int "<<1<<std::endl; throw int(1); } void h()throw(char){ std::cout<<"h:start"<<std::endl; if(false)throw char('1'); } void f(){ std::cout<<"f:start"<<std::endl; try{ h(); g();} catch(char c){ std::cout<<"f:catch char "<<c<<std::endl;} } int main(){ std::cout<<"main:start"<<std::endl; try { f(); } catch(int x){ std::cout<<"main:catch int "<<x<<std::endl;} catch(...){ std::cout<<"main:catch ? "<<std::endl;} std::cout<<"main:end"<<std::endl; } 该函数main捕获了异常并f忽略了它。这就是一切。 main:start f:start h:start g:throwing int 1 main:catch int 1 main:end AnT stands with Russia 2020-08-06T21:42:49Z2020-08-06T21:42:49Z 不推荐使用动态异常规范。 现代异常规范已归结为noexcept. 从 C++17noexcept开始,它是函数类型的一部分。但是仍然不禁止使用throw内部noexept函数并从函数内部调用抛出异常的noexept函数。行为保持不变 - 尝试从函数引发异常noexept会导致调用std::terminate. 许多编译器在遇到函数中未处理throw的情况时会发出警告。noexcept
您会期望出现错误,并且按类型分类的异常逻辑仅用于过滤。一个函数处理一些错误,其他一些更高的错误 - 以不同的方式犁地。这个例子展示了如何对不同的异常进行排序。您希望在这里发出错误不是主题。
该函数
main捕获了异常并f忽略了它。这就是一切。不推荐使用动态异常规范。
现代异常规范已归结为
noexcept. 从 C++17noexcept开始,它是函数类型的一部分。但是仍然不禁止使用throw内部noexept函数并从函数内部调用抛出异常的noexept函数。行为保持不变 - 尝试从函数引发异常noexept会导致调用std::terminate.许多编译器在遇到函数中未处理
throw的情况时会发出警告。noexcept