C++异常处理报错【terminate called after throwing an instance of ‘char const‘】

C++只是在大学中学习过,都是为了应付考试,今天导师给我一个问题,C++异常处理的问题,让我来解决一下,这能怎么办,不会也得会,硬着头皮解决呗

0.问题描述

先看一下代码

//插入的方法
template <class DataType>  
void SeqList<DataType> :: Insert(int i, DataType x)
{
	if (i >= MaxSize)  throw "上溢";
	if (i < 1 || i > length + 1)  throw "位置不对";
	for (int j = length; j >= i; j--)
		data[j] = data[j - 1];             //注意第j个元素存在数组下标为j-1处
	data[i - 1] = x;
	length++;
}


//主函数
int main(){
	int r[5]={1, 2, 3, 4, 5};
	SeqList<int> L(r, 5);
	cout<<"执行插入操作前数据为:"<<endl;
	L.PrintList( );              //输出所有元素
	try{
//		L.Insert(2,10);
		L.Insert(10,30);
	}catch(char *e){
		cout<<e<<endl; 
	}
	cout<<"执行插入操作后数据为:"<<endl;
	L.PrintList( );              //输出所有元素

其实代码还是比较容易的,就是一个数组中的插入问题,在一个插入数组中的位置不对,就会报异常处理。但是在这个程序中异常并没有被捕获到,而是程序会在中间停很长一段时间,并显示出terminate called after throwing an instance of 'char const*',出现这种情况的原因就是在catch中异常并没有匹配上去,C++的析构函数抛出异常将自动调用terminate()终止程序。那这个情况该怎么解决呢?

1.问题解决

其实问题解决还是很简单的,只需要在catch中的char *e 的前面加上const就可以解决,这里是将char *e变成了一个字符串常量指针。

int main(){
	int r[5]={1, 2, 3, 4, 5};
	SeqList<int> L(r, 5);
	cout<<"执行插入操作前数据为:"<<endl;
	L.PrintList( );              //输出所有元素
	try{
//		L.Insert(2,10);
//      问题出现的原因是因为异常类型不匹配导致c++启动了自带的异常处理
//      解决方案:只需要在char 前面加上const将捕获的异常变量变成常量即可 
		L.Insert(10,30);	//第2个参数30会导致抛出异常(i > length + 1)  
	}catch(const char *e){
		cout<<e<<endl; 
	}
	cout<<"执行插入操作后数据为:"<<endl;
	L.PrintList( );              //输出所有元素

}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页