29.C++- 异常处理

try语句处理正常代码逻辑

  • try语句发现异常时,则通过throw语句抛出异常,并退出try语句

catch语句处理异常情况

  • throw语句抛出异常时,则会直接跳到catch语句处理
  • catch语句允许被重载,在try语句后面可以有多个catch语句
  • 不同类型的异常由不同的catch语句捕获,顺序从上往下严格匹配,不会进行隐式转换,比如:
  • cath(...)语句,表示捕获前面所有没被定义的异常,且只能放在所有catch语句的末尾,比如:

运行打印:

 

 

<span "="" src="https://images2018.cnblogs.com/blog/1182576/201804/1182576-20180414155029460-1600156072.png">

 

 

在catch语句块中可以将捕获的异常重新抛出

catch抛出的异常,则需要通过外层的try...catch...捕获

如果是catch(...)语句,则直接填throw;即可,编译器会自动将捕获的异常重新抛出

比如:

运行打印:

 

catch中重新抛出异常的意义

举个例子,当我们调用第三方库的func()函数,但是该func()函数返回的异常是int型,每个异常值意义大有不同 (每次查看异常值都需要翻看文档手册才行)

所以我们可以在自己库创建一个myfunc()函数,通过try...catch...再次封装func()函数,将异常值重新解释为其它类型(比如const char *),然后再次抛出.

以后调用myfunc()函数,获取的异常信息就是const char *类型了.

 

如果catch中抛出的类型是类的情况

  • 需要将捕获子类异常的catch放在上部
  • 捕获父类异常的cath放在下部, 避免子类异常当做父类异常来使用.

比如:

运行打印:

 

<stdexcept>

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

exception类主要有两个分支

- logic_error

用于程序中可避免的逻辑错误,在程序运行之前,就能被检测到

logic_error类派生了以下几种类:

  • domain_error(const string& )    :   专业领域内的范畴
  • invalid_argument(const string& )   :  无效参数,比如对unsigned型进行负数操作
  • length_error(const string& )  :    长度异常,比如字符串附加太多字符
  • out_of_range(const string&)     :    超出范围,比如数组下标越界
  • 它们都有一个what()成员函数,用来返回一个字符串异常信息

 

-runtime_error

常用于程序中无法避免的恶性错误,只在程序运行时才能被检测到

logic_error类派生了以下几种类:

  • range_error(const string& )  :内部计算时发生区间错误
  • overflow_error(const string& )  :算数运算时发生上溢
  • underflow_error(const string& )  :算数运算时发生下溢
  • 它们都有一个what()成员函数,用来返回一个字符串异常信息

比如:

运行打印:

 

 


文章来源:https://www.cnblogs.com/lifexy/p/8832424.html

posted @ 2018-09-20 12:20  康永年  阅读(230)  评论(0)    收藏  举报
友情链接:回力 | 中老年女装 | 英语口语培训 | 托福培训 | 雅思周末班