2015-11-06 124 views
0

如果你有这样的函数调用,哪个级别最适合我的抛出?我只想弹出一条错误消息。C++何时处理异常

class Test { 
    void A() { 
     B(); 
     // try and catch here ? 
    } 

    void B() { 
     C(); 
     // try and catch here ? 
    } 

    void C() { 
     throw 1; 
    } 
    } 

    int main() 
    { 
    Test test; 
    test.A(); 
    // try and catch here ? 

    return 0; 
    } 
+0

这真的取决于实际情况。您可能想要捕获一些异常,同时让其他异常传播到调用堆栈。 – NathanOliver

+0

恕我直言,只要你知道可以抛出异常,是重要的事情。在哪里或如果你抓住它,这是主观的。 – PaulMcKenzie

+0

@PaulMcKenzie _subjective_在这里没有完全适合恕我直言,_使用情况依赖_应该是更好的描述。我不是那么确定,如果这会让问题脱离主题,或者需要更多的澄清。 –

回答

0

当您决定处理异常时,很大程度上取决于设计模式和特定场景,但通常情况下,只要您能够可靠地处理,就想处理异常。

如果您没有足够的信息来处理异常,则应该在调用堆栈中抛出较高的异常。一些理由如下:

  1. 例外是不是检查返回类型错误处理
  2. 更加昂贵,如果你继续抛出异常调用堆栈大量的代码将无法运行(或者至少你必须写很多凌乱的finally块)
  3. 功能,高调用堆栈上将会引起了很多不同类型的异常所累,并在其预期的工作的方式得到

反之,如果赶上和交易只要你能够可靠地尽早发生异常这样做的:

  1. 功能是调用堆栈比catch块甚至不知道发生了例外

  2. 你将避免过度的异常抛出获得的性能提升更高

  3. 一般都比较好设计分离问题。

+0

_“你将通过避免过多的异常抛出来获得性能提升”_这是'catch'引入成本,而不是'throw'。 –

0

那么,这取决于您的实际使用情况。

如果你只是想弹出一个错误信息,并终止你的程序,你应该什么也不抓。

默认的std::terminate处理程序已经做到了。

如果您只是想显示一条错误消息并继续构建,您应该从可以克服错误并能够安全地继续您的程序运行状态的级别捕获。