异常
什么是异常
非正常(警告,错误)
库发现异常,把异常抛出,库的用户处理异常;
异常处理机制
try(检查) -> throw(抛出) -> catch(捕获) try { //检查语句 if(错误) { throw 异常 } } catch(异常类型1) { 异常处理语句1; } ...what 打印异常信息
exception(异常基类)
所有标准异常的父类
逻辑异常(logic error)
length_error
试图生成一个超出该类型最大长度的对象
domain_error
参数的值域错误,主要用在数学函数中。
out_of_range
超出有效范围
invalid_argument
参数不合适
运行异常(runtime error)
range_error
计算结果超出了有意义的值域范围
overflow_error
算术计算上溢
underflow_error
算术计算下溢
多种异常
eg
void convert(int *arr, int size, int n)
throw(invalid_argument,out_of_range)
{
if( (n < 0) || (n > size))
{
throw out_of_range("N,不在取值范围内,N太大了"); //超出范围异常
}
if (NULL == arr)
{
throw invalid_argument("arr,指针不能为空"); //无效参数
}
int i,j,temp;
for(i = 0, j = n -1; i < j; i++, j--)
{
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
int main()
{
int arr[10] = {0,1,2,3,4,5,6,7,8,9};
//捕获多种异常
try
{
convert(arr,10,-5);
}
catch (const logic_error &err) { //捕获所有的派生类异常
cout << "Error:" << err.what() << endl;
}
for (int i = 0; i < 10; i ++)
{
cout << arr[i] << " ";
}
cout<< endl;
return 0;
}
ie
自定异常
自定义异常类,通常从exception继承,自定义异常类跟标准异常类使用方法一致
eg:
#include <iostream>
using namespace std;
class MyError:public exception{ //继承exception类
public:
MyError(const char *err) noexcept; //noexcept:不会产生异常
const char *what() const noexcept; //noexcept:不会产生异常
private:
const char *errString;
};
MyError::MyError(const char *err)noexcept :errString(err)
{
}
const char *MyError::what() const noexcept
{
return errString;
}
int divException(int x, int y)
throw(MyError)
{
if(0 == y)
{
throw MyError("除数为0");
}
return x/y;
}
int main()
{
int result = 0;
try {
result = divException(10,5);
} catch (const MyError &err) {
cout << "MyError:" << err.what() << endl;
}
cout << result << endl;
return 0;
}
ie: