基本异常处理
异常处理机制:
是一种暂缓问题的处理,不在当前函数中处理,在它的调用者中处理
什么是异常:
任何东西都可以认为是异常,错误只是异常的一种。
异常一旦被抛出,不做处理,若引发异常会调用默认的abort终止程序
捕获和处理异常
throw:抛出异常(返回一个值,是我们处理异常的一个参照)
try(检查捕获异常)和catch(处理异常):try和catch必须一起出现,并且各自的括号{}不能省略
//正常检查代码语句
try{
}
catch(类型/表达式 ){//理解为switch case
处理是根据抛出数据类型决定如何处理
}
一个try可以对应多个catch
try{
}
catch(int){}
catch(double){}
catch(string){}
catch和if else..if运行机制是一样的,只能执行一个匹配项
删减符...
catch(...){//任何类型的异常都可以捕获
}
#include<iostream>
using namespace std;
int divisor(int a, int b) {
if (b == 0) {//什么是异常
throw 0;//如何抛出
}
return a / b;
}
void print(int a,int b) {
cout << divisor(a, b);
}
int main() {
try {
print(1, 0);//引发异常就从当前位置跳到try后面不执行,
cout << "后面的代码";
}
catch (int) {
cout << "除数不能为0";
}
return 0;
}
不存在异常的描述:
throw()
void print()throw() {
cout << "当前函数不存在异常" << endl;
}
新标准中换了一个关键字
noexcept
void printData()noexcept {
cout << "当前函数不存在异常" << endl;
}
异常处理中的传参
catch(int a){//隐藏了一个传参操作
}
想要处理抛出字符串d的异常,注意一下string类型和const char*类型的区别
也可以抛出自己类的对象
#include<iostream>
using namespace std;
class Error {//当前程序所有错误都归类到Erro中
public:
Error(const char* str = "未知错误"):str(str){}
const char* what()const {
return str.c_str();
}
protected:
string str;
};
int divisor(int a, int b) {
if (b == 1) {
throw string("除数不能为1");//构造一个无名参数进行处理了
}
if (b == 0) {
throw "除数不能为0";
}
return a / b;
}
void insertArray(int array[],int* curNum,int posData,int maxLength) {
if (*curNum >= maxLength) {
throw Error("数组下表溢出");
}
array[*curNum] = posData;
(*curNum)++;
}
void print()throw() {
cout << "当前函数不存在异常" << endl;
}
void printData()noexcept {
cout << "当前函数不存在异常" << endl;
//throw();编译不过
}
int main() {
try {
divisor(1, 0);
}
catch (const char* str) {
cout << str << endl;
}
//catch (string str) {直接这样写不行,c++对string要求比较严格
// cout << str << endl;//str="除数不能为0"
//}
try {
divisor(1, 1);
}
catch (string str) {
cout << str << endl;
}
try {
int array[3] = { 0,0,0 };
int curNum = 0;
for (int i = 0; i < 4; i++) {
insertArray(array, &curNum, i, 3);
}
}
catch (Error str) {
cout << str.what() << endl;
}
return 0;
}
标准库中的异常
#include<exception>
#include<iostream>
using namespace std;
class Exception {
public:
Exception(const char* ptr="UnKnow") :ptr(const_cast<char*> (ptr)) {}
virtual const char* what()const {
return ptr;
}
protected:
char* ptr;
};
class Bad_alloc :public Exception {
public:
Bad_alloc(const char* _Message="bad exception"):Exception(_Message){}
protected:
};
int main() {
try {
while (1) {
int* p = new int[100000000];
}
}
catch (bad_alloc& object) {
cout << object.what() << endl;
}
return 0;
}
自定义异常
1.自己写的异常类描述
2.继承标准库中的异常类,重写what()方法