{C++系列} C++基础 day11 异常语法,异常捕获,标准异常类,格式化I/O
in C/C++ with 0 comment

{C++系列} C++基础 day11 异常语法,异常捕获,标准异常类,格式化I/O

in C/C++ with 0 comment

#复习:

1 多态

2 运行时类型信息

========================

二十四# 异常(Exception)

1# 常见的错误

2 回顾C中的错误处理机制

1)通过返回值表示错误

缺点:>错误处理流程比较麻烦,需要逐层判断,代码显示臃肿。
优点:>函数调用路径中的所有局部对象都能正确被析构,不会内存泄露。

2)通过远程跳转处理错误

优点:>不需要逐层判断,一步到位错误的错误,代码精炼。
缺点:>函数调用路径中的局部对象失去被析构的机会,有内存泄露的风险。

3# C++异常机制

结合上面两种错误处理的优点,同时避免它们的缺点,在形式上实现一步到位的错误处理,同时保证局部对象能够正确的被析构。

4# 异常语法

1)#异常抛出

throw 异常对象;

eg:
  throw -1; 
  class FileError{...};
  throw FileError(..);

2)#异常捕获

  try{
          可能会引发异常的代码;
          ...
          抛出异常;//后面语句都不在执行
          ...
          ...
  }
  catch(异常类型1){
          针对异常类型1的处理..
  }
  catch(异常类型2){
          针对异常类型2的处理..
  }
  ...
  catch(...){
          针对其它异常类型的处理..
  }

注:catch子句根据异常对象的类型自上而下顺序匹配,而不是最优匹配,所以对子类类型的异常捕获不要放在对基类类型异常捕获后面,否则前者将被后者提前截获,导致对子类的异常捕获永远执行不到。

5# 函数的异常说明

1)可以在函数原型中增加异常说明,表示该函数可能抛出的异常:

返回类型 函数名(形参表)throw(异常类型表){..}

eg:
  //throw(int,FileError):该函数的异常说明
  //说明该函数可能会抛出int或FileError异常
  void func(...)throw(int,FileError){...} 

2)#两种极端形式

--》不写异常说明:表示可以抛出任何异常
void func(...){}//可以抛出任何异常
--》空异常说明:throw()
void func(...)throw(){}//不会抛出任何异常

注:如果基类中的虚函数带有异常说明,那么子类中的覆盖版本不能说明比基类抛出更多的异常,否则将会导致"放松throw限定"导致编译失败。

6# 标准异常类exception

class exception{
public:
    exception()throw{}
    virtual ~exception()throw{}
    virtual const char* what()const throw(); 
};

======

eg:
class ErrorA:public exception{
    重写what函数:针对A的处理
};
class ErrorB:public exception{
    重写what函数:针对B的处理
};
int main(){
   try{
       //可能会抛出很多异常,包括ErrorA、B
   }
   //exception是基类,可以捕获任何子类的异常
   catch(exception& ex){
       //ex如果引用是子类的异常对象,再去调用
       //重写what函数,实际被执行的将是子类中
       //的what函数
       ex.what();
   }
}

7# 构造函数中的异常

8# 析构函数不要抛出异常


二十五 I/O流

1 主要I/O流类

                        ios
                    /         \
           istream      ostream
        /     |       \   /    |        \
istrstream  ifstream  iostream ofstream  ostrstream
                   /     \
               strstream   fstream

2# 格式化I/O

1)格式化函数

  cout << 100/3.0 << endl;//33.3333 
  cout.precision(10);//设置cout输入浮点数精度
  cout << 100/3.0 << endl;//33.33333333

=====================

Responses