【问题标题】:Should I write catch (...) after catch (exception& e)?我应该在 catch (exception& e) 之后写 catch (...) 吗?
【发布时间】:2021-04-17 21:24:54
【问题描述】:

如果我知道代码中没有程序员定义的异常,并且只想捕获标准库抛出的异常,那么只写catch (std::exception& e)就足够了,或者我仍然需要在它之后写catch (...) ?

int main()
{
try 
{//something
}
catch (std::exception& e) { /*something*/}
catch (...) {/*something*/} //unnecessary? 
}

所以基本上这是一个问题,我可以确定来自std 的所有throw 方法和函数都是从std::exception 派生的异常吗?

【问题讨论】:

  • 很确定所有 C++ 库异常都源自 std::exception 但是,谁知道呢。 Java 比 C++ 做得更好的一件事是强大的类型检查和执行。如果未能捕获异常导致格式错误的代码和编译器诊断,那不是很好吗?
  • 这能回答你的问题吗? C++ catch(std::exception & e ) vs. catch(...)
  • @scohe001 不,因为我知道区别,问题基本上是我可以确定所有从 std 抛出的异常都是从 std::exception 传递的异常

标签: c++ c++11 exception try-catch


【解决方案1】:

我的回答:视情况而定。

您捕获异常的目的是什么?你能做点什么吗?你只是简单地记录它的存在,还是向用户友好地报告而不是崩溃?代码库有多大?您有多确定没有抛出不在标准异常层次结构中的异常?

我有时会这样做,通常是在遇到未捕获的异常并尝试调试它时。我会在其中包含catch (...),以防有人在其中插入throw 42; 或同样出色的东西。但一般来说,我并没有真正在实际代码中使用它们。

【讨论】:

    【解决方案2】:

    是的,cppreference 说:

    标准库产生的所有异常都继承自 标准::异常。

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 2012-06-04
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 2021-07-10
      • 1970-01-01
      • 2014-03-18
      相关资源
      最近更新 更多