ArrayDeque抛出异常后程序终止,如何仅返回指定提示信息?
问题分析与解决
嘿,这个问题我之前也踩过坑!核心问题出在你抛出异常的方式和捕获方式不匹配,导致异常没被正确捕获,才会出现那个terminate called...的错误提示。
问题根源
你在deleteFront里抛出的是指向std::logic_error的指针(用了new):
throw new logic_error("You can't delete from an empty list");
但你的catch语句却在尝试捕获**std::logic_error的实例对象**:
catch(logic_error e)
这就像你扔出去一个盒子的地址,却等着接盒子本身——完全对不上,所以异常没被捕获,程序触发了默认的终止行为。
正确的修正方案
C++异常处理的最佳实践是抛出异常对象而非指针,同时捕获时优先用const引用(避免不必要的拷贝,还能支持多态)。
1. 修改抛出异常的代码
把throw new ...改成直接抛出异常对象:
void ArrayDeque::deleteFront(){ // 直接抛出logic_error对象,不要用new if(isEmpty()) throw logic_error("You can't delete from an empty list"); data.erase(data.begin() + front); }
2. 修改捕获异常的代码
把catch的参数改成const引用:
try{ deque->deleteFront(); }catch(const logic_error& e){ cout << e.what() << endl; // 加个endl让输出立刻显示出来 }
为什么不推荐抛指针?
如果非要抛指针,你得改成catch(logic_error* e),但这样你还得手动delete e来释放内存(否则会内存泄漏),而且这种方式不符合C++异常处理的设计初衷,容易出错,所以完全没必要这么做。
按照上面的修改,当你从空列表删除元素时,就能正确输出你想要的提示信息:You can't delete from an empty list了。
内容的提问来源于stack exchange,提问作者user5367640
相关产品推荐
相关产品推荐

