异常和IO流解读.ppt

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
异常和I/O流 一、异常 1、何为异常 在设计、编码甚至测试阶段无法遇见的潜在错误,通常与用户的运行环境、操作方式甚至使用习惯有关。 一、异常 2.如何处理异常? A.异常捕获 try{ 可能引发异常的代码; } catch(异常类型1 异常对象1){ 处理异常类型1的异常; } catch(...){ 处理其他异常类型的异常 } B.异常抛出 throw 异常对象; 一、异常 3.异常处理流程 1)不发生异常 两个不执行:throw语句不执行,catch块不执行 两个执行: throw语句后面的代码执行,引发异常的语句后面的代码执行 2)发生异常 两个不执行:throw语句后面的代码不执行,引发异常的语句后面的代码不执行 两个执行: throw语句执行,catch块执行 异常抛出的流程类似于通过return返回,区别在于返回后不是执行调用语句的下一条语句,而是沿着函数栈回朔,其目的就是为了析构调用路径中的局部对象,直到该异常被catch子句捕获为止,C++的异常处理,将形式上的远程跳转和实际的调用回朔同一起来,即保证代码简洁,同时又避免了内存泄漏。 一、异常 4.异常的使用模式 1)抛出基本类型的异常,通过异常的值区分异常的种类。 2)抛出不同类型的异常,通过异常的类型区分异常的种类。 3)为异常对象附加必要的调试信息,便于事后故障分析和诊断。 4)不捕获异常,继续抛出。 如果一个函数执行了某种抛出异常的操作,但是并未捕获该异常,那么异常将会从该函数中继续向其调用者抛出,依此类推,直到main函数,如果main函数也没有捕获该异常,则被系统捕获,杀死进程。 5)捕获异常,并完成一部分处理,然后继续抛出。 一、异常 6)可在函数原型占用添加异常说明字句,显示指明该函数可能抛出的异常范围。 返回类型 函数名(形参表)[const] throw(异常列表); A.如果函数抛出了异常说明范围以外的异常,无法被捕获,最后由系统接收,杀死进程。 B.无说明和空说明 无说明即没有异常说明,表示可以抛出任何类型的异常。 空说明即throw(),表示不抛出任何类型的异常。 C.如果函数的声明和定义分开书写,那么异常说明应该保持一致。 D.在多态父子类之间,子类的覆盖版本不能说明比基类的原始版本抛出更多的异常类型。 eg:class X{ public:virtual void foo(void) const throw(int, double){} }; class Y:public X{ public: void foo(void) const throw (double, int, char){} //错误,foo的异常说明类型不能比基类多 }; 一、异常 7)如果异常类型之间存在继承关系,捕获他们,针对子类catch子句一定要放在针对基类的catch子句之前。 8)对于类类型的异常,建议通过引用来捕获,不要使用对象,但是异常类型却需要支持深拷贝。 5.构造和析构函数中的异常 1)构造函数中可以抛出异常,而且也只能通过异常来表示构造过程中的错误。但是如果在构造函数中抛出了异常,所构造的对象实际上是一个不完整的对象,而不完整对象的析构函数是永远不可能执行的。这样一来在构造过程所分配的动态资源,就无法通过析构函数释放,将导致内存泄漏。因此就需要在构造函数抛出异常之前,释放这些本来应该在析构函数中释放的资源。除非使用自动指针(auto_ptr),利用构造函数的自动回滚,释放该指针所指向的动态资源。 2)析构函数中不要抛出异常,而且可能引发异常的操作,尽量内部小花,防止该异常从析构函数中被抛出。 一、异常 6.标准库异常 头文件#include stdexcept 基类 exception - virtual const char * what(void) const whrow() = 0; 子类 runtime_error 子类 overflow_error //上溢异常 子类 underflow_error //下溢异常 子类 logic_error 子类 invalid_argument //非法参数异常 子类 length_error //长度异常 子类 out_of_range //越界异常 子类 bad_alloc //内存分配异常 子类 bad_cast //动态类型转换异常 子类 bad_type_id //非法类型标识 子类 bad_exception //一般故障异常 二、I/O流 1.I/O流对象 通常是基于iostream类及其子类的定义的对象,其中派生于istream

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档