我正在从各种资源中阅读有关“C ++异常处理”(EH)的文献。我已经理解了概念和语法。但是在更大的范围内,我很困惑。
我们编写代码来完全执行它。期望编写的代码将以已知的特定方式执行。如果代码的某些部分抛出异常并且处理它并且程序继续执行。但是从抛出点到catch函数,一些函数没有执行,通常它们应该已经执行,那么程序如何继续进一步继续,因为它没有完全执行。
我遇到过告诉EH用于错误恢复的语句。 但我需要一些具体的例子来看看错误恢复意味着什么/它是如何完成的,尤其是在C ++ EH中。
答案 0 :(得分:1)
当抛出异常时,执行 not 从抛出异常之后的那一点继续执行。相反,执行被转移回“最近的” 1 catch
块,它可以捕获抛出的异常类型。在执行catch
块中的代码之后,继续执行后面的任何代码,就像平常一样。 可能(最终)返回到引发异常的代码,但1)不一定,2)如果确实如此,重新运行导致该代码的代码,所以如果没有抛出异常(无论出于何种原因),可以预期以下代码正常执行(当然,假设其他代码是异常安全的,因此在此过程中没有任何内容被破坏)。
使用异常(或其他方式,TBH)很难找到错误处理的好例子,主要是出于使用EH开始的一些相同原因 - 正确处理异常的代码通常(通常是?)相当具体到手头的应用程序。对于一些小型实用程序等,它可能只打印出错误消息并退出。对于无论发生什么情况都需要继续运行的服务器,它可能会向日志写入内容,然后继续执行。
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();
}
}
答案 3 :(得分:0)
也许“强异常安全”的概念在某种程度上解决了你的两个问题。一个非常安全的函数将会定期完成,或者,如果抛出,则保留程序状态,就像它被调用之前一样。
如果可以实现,请忽略当前,我们假设您的代码由强异常安全函数组成:
通常,“错误恢复”在这里意味着回滚任何更改。这通常只能通过暂时做一切来实现,例如。在副本上,直到确保成功。
除此之外,错误恢复是设计程序的一个架构问题,其中包含许多地方,其中存在替代执行路线。