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()成员函数,用来返回一个字符串异常信息
比如:
运行打印: