在程序运行环境正常的情况下,导致运行异常的 错误是不会出现的 程序异常错误往往是由于程序设计者对程序运行 环境的一些特殊情况考虑不足所造成的。 导致程序运行异常的情况是可以预料的,但它是 无法避免的。 为了保证程序的鲁棒性(Robustness),必须 在程序中对可能的异常进行预见性处理
◼ 在程序运行环境正常的情况下,导致运行异常的 错误是不会出现的。 ◼ 程序异常错误往往是由于程序设计者对程序运行 环境的一些特殊情况考虑不足所造成的。 ◼ 导致程序运行异常的情况是可以预料的,但它是 无法避免的。 ◼ 为了保证程序的鲁棒性(Robustness),必须 在程序中对可能的异常进行预见性处理
■例如,下面程序的鲁棒性不高! void f(char *filename) ifstream file(filename); int X; file>>x;/如果filename指定的文件不 /存在,将会出现运行异常」 /异常时,的值不正确! ■■■■■■
◼ 例如,下面程序的鲁棒性不高! void f(char *filename) { ifstream file(filename); int x; file >> x; //如果filename指定的文件不 //存在,将会出现运行异常! ... x ... //异常时,x的值不正确! ...... }
处理异常的策略 就地处理 。 在发现错误的地方处理异常 ■异地处理 ·在其它地方(非异常发现地)处理异常
处理异常的策略 ◼ 就地处理 • 在发现错误的地方处理异常 ◼ 异地处理 • 在其它地方(非异常发现地)处理异常
异常的就地处理 常用做法是调用C++标准库中的函数exit 或aborts终止程序执行(在cstdlib或 stdlib.h中声明) ·abort立即终止程序的执行,不作任何的善后 处理工作 ext在终止程序的运行前,会做关闭被程序打 开的文件、调用全局对象和static存储类的局 部对象的析构函数(注意:不要在这些对象类 的析构函数中调用ext)等工作
异常的就地处理 ◼ 常用做法是调用C++标准库中的函数exit 或abort终止程序执行(在cstdlib或 stdlib.h中声明) • abort立即终止程序的执行,不作任何的善后 处理工作。 • exit在终止程序的运行前,会做关闭被程序打 开的文件、调用全局对象和static存储类的局 部对象的析构函数(注意:不要在这些对象类 的析构函数中调用exit)等工作
■例如: void f(char *filename) ifstream file(filename); if(file.fail(O)》 {cout<<"文件打开失败n"; exit(-1); } int x; cin >X; } 不管abort:还是exit,都“not user-friendly
◼ 例如: void f(char *filename) { ifstream file(filename); if (file.fail()) { cout << "文件打开失败\n"; exit(-1); } int x; cin >> x; ...... } ◼ 不管abort还是exit,都“not user-friendly