在c++中,如果我没有说明要抛出什么类型的对象,抛出什么抛出语句

What throw statement throws if i do not tell what type of object is to be thrown in c++?

本文关键字:什么 类型 语句 对象 说明 c++ 如果      更新时间:2023-10-16

由于没有显式抛出对象,下面的代码异常终止。下面代码中的throw语句抛出了什么?

int main()
{
  try{
  cout<<"try";
  throw ;
}
catch(...){
 cout<<"catch";
 }
return 0;
}

不带参数的throw只能在catch语句中使用,以重新抛出捕获的异常对象。您的代码试图在catch语句之外使用它-相反,您应该选择要抛出的类型,如果有疑问,从std::runtime_error开始并不是不合理的。有关更多选项,请参阅此处。你也可以抛出你自己的类型,但通常从标准库提供的类型中派生它们是一个好主意,这样客户端代码就有更好的机会为所有逻辑上相似的错误指定适当的处理,而不是单独捕获和处理它们,并不断更新每个新的可能的错误。

本标准在15.1/9中规定:

如果当前没有处理异常,执行一个没有操作数的抛出表达式调用std::terminate()

所以非常明确,"抛出什么…"的答案是不抛出,而调用std::terminate

所以问题是:"当我throwcatch块之外时会发生什么?"这个问题的答案可以在其文档中找到:

重新抛出当前处理的异常。放弃当前catch块的执行,并将控制传递给下一个匹配的异常处理程序(但不传递给同一个try块之后的另一个catch子句:它的复合语句被认为已经"退出"),重用现有的异常对象:不生成新对象。此形式仅在当前正在处理异常时允许使用(如果不使用则调用std::terminate)。与function-try-block相关联的catch子句如果用于构造函数,必须通过重新抛出退出。

强调我的。