c++中的异常处理

异常的概念

程序在运行过程中可能产生异常

异常(Exception)与Bug的区别

  异常是程序运行时可预料的执行分支

  Bug是程序中的错误,是不被预期的运行方式

 

异常(Exception)和Bug的对比

异常

  运行时产生除0的情况

  需要打开的外部文件不存在

  数组访问时越界

Bug

  使用野指针

  堆数组使用后未释放

  选择排序无法处理长度为0的数组

 

c++内置了异常处理的语法元素try...catch...

try语句处理正常代码逻辑

catch语句处理异常情况

try语句中的异常由对应的catch语句处理

 

c++通过throw语句抛出异常信息

 

c++异常处理分析

throw抛出的异常必须被catch处理

  当前函数能够处理异常,程序继续往下执行

  当前函数无法处理异常,则函数停止执行,并返回

 

未被处理的异常会顺着函数调用栈向上传播,直到被处理为止,否则程序将停止执行。

 

同一个try语句可以跟上多个catch语句

  catch语句可以定义具体处理的异常类型

  不同类型的异常由不同的catch语句负责处理

  try语句中可以抛出任何类型的异常

  catch(...)用于处理所有类型的异常

  任何异常都只能被捕获(catch)一次

 

异常处理的匹配规则

异常抛出后,至上而下严格匹配每一个catch语句处理的类型

异常处理匹配时,不进行任何的类型转换

 

catch语句块中可以抛出异常

catch中抛出的异常需要外层的try...catch...捕获

 

异常的类型可以是自定义类类型

对于类类型异常的匹配依旧是至上而下严格匹配

赋值兼容性原则在异常匹配中依然适用

一般而言

  匹配子类异常的catch放在上部

  匹配父类异常的catch放在下部

 

在工程中会定义一系列的异常类

每个类代表工程中可能出现的一种异常类型

代码复用时可能需要重解释不同的异常类

在定义catch语句块时推荐使用引用作为参数

 

c++标准库中提供了实用异常类族

标准库中的异常都是从exception类派生的

exception类有两个主要的分支

logic_error

  常用于程序中的可避免逻辑错误

runtime_error

  常用于程序中无法避免的恶性错误

小结

catch语句块中可以抛出异常

异常的类型可以是自定义类类型

赋值兼容性原则在异常匹配中依然适用

标准库中的异常都是从exception类派生的

posted @ 2018-06-23 00:30  sugarwill  阅读(296)  评论(0编辑  收藏  举报