在C++中,是否可以抛出一个不会被std :: exception捕获的异常?

Net*_*zen 2 c++ exception

问题1:

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

try
{
}
catch(std::exception & e)
{
}
catch(...)
{
  //Is this block needed?
}
Run Code Online (Sandbox Code Playgroud)

问题2:

有没有更好的:

catch(std::exception & e)
Run Code Online (Sandbox Code Playgroud)

要么

catch(std::exception e)
Run Code Online (Sandbox Code Playgroud)

要么

catch(const std::exception &e)//<--- this is the method I usually use
Run Code Online (Sandbox Code Playgroud)

sho*_*osh 11

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

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

  • @dribeas - COM以完全不同的方式执行异常; 但是,MS确实设计了他们的MFC库来抛出/捕获指针.这是因为当他们第一次尝试实现它时,他们的C++编译器不支持异常!所以它只是在setjmp/longjmp上的宏,没有堆栈展开......令人敬畏的半生不熟. (3认同)

Dan*_*ker 6

当然,你可以抛出你想要的任何类型,而且不需要从中派生出来std::exception.

抓住const参考更好.原因是你可以扔一个const或一个非const,它可以被非抓住const.这就像沉默的铸造一样const.