【问题标题】:In C++, is is possible to throw an exception that will not be caught by std::exception?在 C++ 中,是否可以抛出 std::exception 不会捕获的异常?
【发布时间】:2009-05-25 21:25:43
【问题描述】:

问题 1:

是否有可能抛出一个不会被 std::exception 捕获的异常?

try
{
}
catch(std::exception & e)
{
}
catch(...)
{
  //Is this block needed?
}

问题 2:

有没有更好:

catch(std::exception & e)

或者

catch(std::exception e)

或者

catch(const std::exception &e)//<--- this is the method I usually use

【问题讨论】:

    标签: c++ exception


    【解决方案1】:

    Q1:是的。您可以抛出任何类型,而不是从 std::exception 继承的必要类型。
    你可以写 throw 1; 来抛出和 int 或 throw "hello"; 来抛出 char*,这两者都不是从 std::exception 继承的。然而,这被认为是不好的做法,因为类的用户不能指望你扔任何东西。如果您不想从 std::exception 继承,您通常会创建自己的异常层次结构。

    Q2:按值捕获异常(第二个选项)是一种不好的做法,因为您强制复制异常实例并且可能执行可能导致进一步异常的分配。
    使用第一个选项建议您打算更改 catch 块中的e,这也是您可能希望避免的事情,因为异常通常在创建后保持不可变。唯一剩下的就是第三个选项了。

    【讨论】:

    • "唯一剩下的就是第三个选项" -- 另一个选项,但不是一个很好的选项,是通过指针抛出和捕获。
    • @ChrisW:即使微软已经通过COM把它变成了一个常见的选项,但一般来说,不建议使用指针投掷和捕捉。 parashift.com/c++-faq-lite/exceptions.html#faq-17.6
    • @dribeas - COM 以完全不同的方式处理异常;但是,MS 确实设计了他们的 MFC 库来抛出/捕获指针。这是因为当他们第一次尝试实现它时,他们的 C++ 编译器不支持异常!所以它只是 setjmp/longjmp 上的宏,没有堆栈展开......真是半生不熟。
    • 在 MS 环境中,您也有结构化异常 _SEH,它完全使用另一种机制。
    • “按指针抛出”实际上是“按值抛出”,因为你抛出一个指针,指针被复制。
    【解决方案2】:

    可以肯定,你可以抛出任何你想要的类型,它不需要从std::exception派生。

    捕获const 引用会更好。原因是你可以抛出const或非const,它可以被非const捕获。这就像无声地抛弃const

    【讨论】:

    • 例如“throw 1;”是合法的。
    • 你能举个例子说明为什么用 const 更好吗?用 std::exception e 代替的危险情况?
    • 为什么最好用 const 捕获的一个例子是 thrower 可能会抛出一个 const 静态实例,期望 catcher 不会修改它。
    • 在 ChrisW 之后,抛出异常并不一定要结束程序,因此如果您修改了该静态 const 对象,则会对下次发生该异常时的语义产生负面影响。
    【解决方案3】:

    第二个问题的答案是你应该按值抛出并按引用捕获。如果你按值捕获,你可能会得到'object slicing'。

    【讨论】:

    • 加上复制过程中可能触发其他异常的不便(异常内部数据的复制,内部缓冲区的分配——考虑消息字符串)
    【解决方案4】:

    有时需要抛出不继承自 std::exception 的异常。在发布共享库时,最好的做法是重新实现或封装大多数 std 库类型,而不是公开直接使用它们的方法/函数,因为这会导致各种链接器/编译器互操作性问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2014-04-23
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      相关资源
      最近更新 更多