Bad Re-throw编译但在运行时崩溃

时间:2009-08-21 08:49:39

标签: c++ exception

以下代码将编译但在运行时崩溃:

int main() {

    try {
        throw;
    }
    catch(...){
        cout<<"In catch";
    }
     return 0;

}

结果:“hello.exe中0x7c812a5b处的未处理异常:Microsoft C ++异常:[rethrow] @ 0x00000000”

为什么编译器允许代码编译?对于编译器而言,查看此代码是否是catch块的一部分看起来并不困难。

7 个答案:

答案 0 :(得分:5)

如果编译器编写者将足够的工作投入其中,编译器可能会捕获数百万个错误。但是那些编译器编写者必须判断这项工作是否值得。在这种情况下,他们决定不(我同意他们)。

答案 1 :(得分:5)

来自C ++标准(15.1.8)

  

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

由于标准允许它并给出明确的语义,编译器只能符合它。

答案 2 :(得分:3)

不那么容易。您可以在其他函数的catch块中调用此函数。

this answer中描述了所谓的异常处理程序的概念。

答案 3 :(得分:2)

您可以将throw放入从catch块调用的函数中。如果您对一类例外有共同处理,则有时很有用:

void handleXExceptions()
{
   try {
      throw;
   } catch (XA&) {
      ...
   } catch (XB&) {
      ...
   } catch (X&) {
      assert("Update handleXExceptions" == NULL); 
   }
}

void f() {
   try {
      ...
   } catch (X&) {
      handleXExceptions();
   }
}

void g() {
   try {
      ...
   } catch (X&) {
      handleXExceptions();
   }
}

答案 4 :(得分:2)

仅仅因为代码是合法的。你可以这么说:

int* p=0;
*p = 0;

以及其他数以千计的例子。这是合法的但非常错误。

答案 5 :(得分:0)

如何知道函数的调用者不会捕获异常?

答案 6 :(得分:0)

谢谢,我认为我明白了,它就像抛出null异常(没有什么可以抛出)而且编译器不应该为我们做空检查。