【问题标题】:C++ catch(std::exception & e ) vs. catch(...)C++ catch(std::exception & e) 与 catch(...)
【发布时间】:2020-07-26 16:01:17
【问题描述】:

我知道处理这两种捕获的区别,但是椭圆如何捕获 std::exception 捕获无法捕获的东西?

例如:

try
{
    throw std::runtime("runtime error!");
}
catch(const std::exception& e)
{
    std::cout << "Exception: " << e;
}
catch(...)
{
    std::cout << "How did I get here?";
    throw;
}

我已经看到了结合使用这两种方法的代码示例,但我没有看到你会同时使用这两种方法的原因。

【问题讨论】:

  • 如果try里面的代码没有抛出基于std::exception的异常呢?
  • 如果您来自 Java 或 C#,请注意,在 C++ 中,您基本上可以抛出任何类型或对象。你不必使用继承自std::exception的类
  • throw 42; 例如...

标签: c++ exception exception-handling


【解决方案1】:
catch(const std::exception& e)

只会捕获标准异常。

catch(...)

之后会抓住那里的一切。

您可以处理整数和其他类型 (http://www.cplusplus.com/doc/tutorial/exceptions/)

例如:

catch(int e)

【讨论】:

  • 我有这个问题,找到了答案,但在 SO 上找不到这样的问题。
  • Self answers are indeed encouraged。如果一直都是你的本意,以后最好一起写Q&A。 “提问”页面底部有一个复选框,可打开一个答案面板。
  • Snap,我知道有办法让它成为一个自我回答,我的错。
【解决方案2】:

虽然这样做绝对是个好主意,但您没有std::exception 派生自定义异常。 C++ 允许您抛出几乎任何对象类型。

例如,throw 1; 不会由您的第一个处理程序处理。也不会...

class MyCustomException { // Doesn't derive
 ///
};

...如果它被抛出。

【讨论】:

    【解决方案3】:

    你的意思可能是:

    throw std::runtime_error("runtime error!"); // not std::runtime
    

    std::runtime_error 是从std::exception 派生的,因此您的第一个catch 块在捕获std::exception 类型的异常时被触发。您的意思可能是:

    std::cout << "Exception: " << e.what(); // not e
    

    如果你扔了除std::run_timestd::exception 及其派生词之外的任何其他东西,第二个catch 块将被触发。 C++ FAQ 中的有用阅读: What should I throw?

    【讨论】:

      【解决方案4】:

      正如所写,throw 语句抛出一个类型派生自std::exception 的对象,因此它被第一个catch 子句捕获。如果将 throw 更改为 throw 3;,异常将被第二个 catch 子句捕获,而不是第一个。

      【讨论】:

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