You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:11:39