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( ); //输出所有元素
}