关于C ++异常处理

时间:2013-10-16 05:25:53

标签: c++ exception visual-c++ exception-handling

我正在从各种资源中阅读有关“C ++异常处理”(EH)的文献。我已经理解了概念和语法。但是在更大的范围内,我很困惑。

  1. 我们编写代码来完全执行它。期望编写的代码将以已知的特定方式执行。如果代码的某些部分抛出异常并且处理它并且程序继续执行。但是从抛出点到catch函数,一些函数没有执行,通常它们应该已经执行,那么程序如何继续进一步继续,因为它没有完全执行。

  2. 我遇到过告诉EH用于错误恢复的语句。 但我需要一些具体的例子来看看错误恢复意味着什么/它是如何完成的,尤其是在C ++ EH中。

4 个答案:

答案 0 :(得分:1)

当抛出异常时,执行 not 从抛出异常之后的那一点继续执行。相反,执行被转移回“最近的” 1 catch块,它可以捕获抛出的异常类型。在执行catch块中的代码之后,继续执行后面的任何代码,就像平常一样。 可能(最终)返回到引发异常的代码,但1)不一定,2)如果确实如此,重新运行导致该代码的代码,所以如果没有抛出异常(无论出于何种原因),可以预期以下代码正常执行(当然,假设其他代码是异常安全的,因此在此过程中没有任何内容被破坏)。

使用异常(或其他方式,TBH)很难找到错误处理的好例子,主要是出于使用EH开始的一些相同原因 - 正确处理异常的代码通常(通常是?)相当具体到手头的应用程序。对于一些小型实用程序等,它可能只打印出错误消息并退出。对于无论发生什么情况都需要继续运行的服务器,它可能会向日志写入内容,然后继续执行。


  1. 这里“最近”与源代码中的位置无关 - 它基于执行。当执行try块中的代码时,相应的catch块被设置为堆栈样式。抛出异常时,堆栈将展开,直到它到达可以处理抛出的异常的catch块。

答案 1 :(得分:0)

例外是安全网,但它们并不意味着处理程序员错误(即段错误)

例如,假设您正在尝试读取尚未写入的磁盘上的文件,但您知道它将在某个时刻出现。您想要崩溃并烧毁整个过程吗?可能不是。

如果您发现某种异常表明该文件尚未存在,您可以通过稍后重试或记录某种消息来适当处理。

答案 2 :(得分:0)

注意 EH =异常处理

我们做EH以确保我们不会得到程序的运行时异常行为,这可能是由于任何执行点的某些意外输入/数据或处理中的数据损坏。这取决于开发人员如何处理异常,即显示任何错误消息或更正数据并继续。

例如

class PlayGame{
private:
 /* variable */
public:
bool inputUserName() throw(){
   **** if user do not enter name throw exception
}
void play(){
********
}
void end(){
 ****
}
};

void game() throw(){
     PlayGame pg;
     pg.inputUserName();
     pg.play();
     pg.end();
}
void main(){
  /* one way of work */
  try{
     game()
  }catch (exception& e){
      cout<<"Error occour.. user name missing..\n";
  }

  /* second way can be */ 
try{
     game();
  }catch (exception& e){
     cout<<"Please enter name first...\n";
     game();
  }
}

This is good example of understanding EH in c++

答案 3 :(得分:0)

也许“强异常安全”的概念在某种程度上解决了你的两个问题。一个非常安全的函数将会定期完成,或者,如果抛出,则保留程序状态,就像它被调用之前一样。

如果可以实现,请忽略当前,我们假设您的代码由强异常安全函数组成:

  1. 显然,只要发现异常,执行就可以继续。只是在有另一条执行路线的地方抓住它。最终根本不执行该程序。当然,你必须承认未能执行的可能性。然而,其他任何事情都是完美的,有点不切实际。
  2. 我推荐Herb Sutter的“Exceptional C ++”书籍(参见http://www.gotw.ca/publications/xc++s.htm)或他的周刊大师帖子,例如: http://www.gotw.ca/gotw/059.htm
  3. 通常,“错误恢复”在这里意味着回滚任何更改。这通常只能通过暂时做一切来实现,例如。在副本上,直到确保成功。

    除此之外,错误恢复是设计程序的一个架构问题,其中包含许多地方,其中存在替代执行路线。