如果我不告诉 C++ 中要抛出啥类型的对象,会抛出啥 throw 语句?

Posted

技术标签:

【中文标题】如果我不告诉 C++ 中要抛出啥类型的对象,会抛出啥 throw 语句?【英文标题】:What throw statement throws if i do not tell what type of object is to be thrown in c++?如果我不告诉 C++ 中要抛出什么类型的对象,会抛出什么 throw 语句? 【发布时间】:2015-07-13 06:41:45 【问题描述】:

以下代码异常终止,因为没有明确抛出任何对象。下面代码中的 throw 语句抛出了什么?

int main()

  try
  cout<<"try";
  throw ;

catch(...)
 cout<<"catch";
 
return 0;

【问题讨论】:

【参考方案1】:

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

FWIW,标准在 15.1/9 中说:

如果当前没有处理异常,则执行一个没有操作数的 throw-expression 调用 std::terminate()

非常明确,“抛出什么......”的答案是没有进行任何抛出,而是调用std::terminate

【讨论】:

这是正确的,但它回答了问题吗?你说“不要那样做”是对的,但问题不是“如果我还是那样做怎么办?”【参考方案2】:

所以问题是:“当我 throwcatch 块之外时会发生什么?” 这个问题的答案可以在它的 documentation 中找到:

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

强调我的。

【讨论】:

以上是关于如果我不告诉 C++ 中要抛出啥类型的对象,会抛出啥 throw 语句?的主要内容,如果未能解决你的问题,请参考以下文章

当整数除以零时,msvc 6 会抛出啥?

抛出啥异常? (Python)[重复]

抛出错误

Java 异常

你能在 Java 中抛出啥?

java中的引用类型