如果我不告诉在c ++中抛出什么类型的对象,throw throw语句会抛出什么?

Far*_*hid 6 c++ exception-handling

以下代码异常终止,因为没有显式抛出任何对象.throw语句在以下代码中抛出了什么?

int main()
{
  try{
  cout<<"try";
  throw ;
}
catch(...){
 cout<<"catch";
 }
return 0;
}
Run Code Online (Sandbox Code Playgroud)

Ton*_*roy 16

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

FWIW,标准在15.1/9中说:

如果当前没有处理异常,则执行不带操作数调用的throw-expressionstd::terminate().

所以非常明确地说,"抛出什么......"的答案是没有投掷,std::terminate而是被调用.

  • 这是正确的,但它是否回答了这个问题?你正确地说"不要那样做",但不是"如果我这样做会怎么样?"的问题. (3认同)

Bau*_*gen 5

所以问题是:"当我throw在一个catch街区外时会发生什么?" 答案可以在其文档中找到:

重新排列当前处理的异常.放弃当前catch块的执行并将控制传递给下一个匹配的异常处理程序(但不会在同一个try块之后传递给另一个catch子句:它的compound-statement被认为已经'退出'),重用现有的异常对象:没有新的对象.此表单仅在当前正在处理异常时允许(如果另外使用则调用std :: terminate).如果在构造函数上使用,则与函数try-block关联的catch子句必须通过rethrowing退出.

强调我的.