0

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

  1. 我们编写代码来完全执行它。预计编写的代码将以已知的特定方式执行。如果代码的某些部分抛出异常并且它被处理并且程序继续执行。但是从 throw point 到 catch 函数,一些函数没有执行,通常它们应该是,那么程序没有完全执行,为什么还能继续执行。

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

4

4 回答 4

1

引发异常时,不会从引发异常的位置立即继续执行。而是将执行转移回“最近”的1 catch块,该块可以捕获引发的异常类型。在该catch块中的代码执行之后,就像往常一样,继续执行后面的任何代码。这可能(最终)导致返回引发异常的代码,但 1)不一定,2)如果确实如此,则重新运行导致该点的代码,因此如果没有引发异常(无论出于何种原因)可以预期以下代码可以正常执行(当然,假设其他代码是异常安全的,因此在此过程中没有任何问题)。

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


  1. 这里的“最近”与源代码中的位置无关——它基于执行。当一个try块中的代码被执行时,相应的catch块被设置为堆栈样式。当抛出异常时,堆栈会展开,直到它到达catch可以处理抛出异常的块。
于 2013-10-16T05:40:45.077 回答
0

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

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

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

于 2013-10-16T05:39:21.517 回答
0

也许“强异常安全”的概念在某种程度上为您的两个问题提供了答案。一个异常安全的函数要么定期完成,要么如果抛出,则将程序的状态保持在调用之前的状态。

暂时不考虑是否可以实现,假设您的代码由强异常安全函数组成:

  1. 显然,只要捕获到异常,就可以继续执行。只需在有替代执行路线的地方抓住它。最终根本不执行程序。当然,您必须承认执行失败的可能性。然而,其他任何事情都是完美的,有些不切实际。
  2. 我推荐 Herb Sutter 的“Exceptional C++”书籍(参见http://www.gotw.ca/publications/xc++s.htm)或他的 Guru-of-the-Week 帖子,例如http://www.gotw。 ca/gotw/059.htm

一般来说,这里的“错误恢复”意味着回滚任何更改。这通常只能通过试探性地做所有事情来实现,例如。在副本上,直到确保成功。

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

于 2013-10-17T05:53:37.387 回答
0

Note EH = Exception handling

We do EH to make sure that we do not get run time abnormal behavior of program, which can be due to some unexpected input/data at any point of execution or data corruption in processing. It depends on developer how he handles exception(s) i.e show any error message or correct the data and continue.

for example

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++

于 2013-10-16T06:23:57.430 回答