怎样捕获new异常

xdh0817 2013-11-28 05:11:17
try
{
class_a *p = new class_a();//可能有异常
。。。
p->xx();//数据库接口,可能有异常
。。。
}
catch(SQLException &sqlex)
{
}
catch(exception &ex)
{

}
catch(...)
{
}
return ;


我要区分上面两种异常,new的异常怎么捕获呢?
...全文
419 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
szhyu 2013-12-02
  • 打赏
  • 举报
回复
引用 12 楼 xdh0817 的回复:
[quote=引用 11 楼 ForestDB 的回复:] new的异常其实是个悖论 new都能抛异常,整个运行环境早就不像样了,估计也catch不住了。
我刚理解你的意思~ 假设new可以有异常,用catch来捕获。那C语言里的malloc函数呢,一般会对返回值判空,这有用吗?[/quote] malloc可以通过返回值判断,他只管分配内存. new 还有构造函数, 你也可以通过new (nothrow)后是否为空来判断,但那样不能捕获构造函数的异常了
FrankHB1989 2013-12-02
  • 打赏
  • 举报
回复
引用 12 楼 xdh0817 的回复:
[quote=引用 11 楼 ForestDB 的回复:] new的异常其实是个悖论 new都能抛异常,整个运行环境早就不像样了,估计也catch不住了。
我刚理解你的意思~ 假设new可以有异常,用catch来捕获。那C语言里的malloc函数呢,一般会对返回值判空,这有用吗?[/quote] 一般是没用,但要不判空,真空了的时候就UB了,好好折腾实现吧。 抛出bad_alloc虽然实际上好不了多少,但是原则上还算是“保证”程序行为可预测的(当然不算其它代码的问题)。
FrankHB1989 2013-12-02
  • 打赏
  • 举报
回复
引用 5 楼 yshuise 的回复:
用try....catch代码多丑陋啊! 用Rall技术就可漂亮的解决异常的问题。 在c++领域,本人曾经(在国内)爬上了巅峰的,见boost::lambda,说实话我已经看不懂我写的什么玩艺儿。 http://blog.csdn.net/yshuise/article/details/5919585
巅峰……怎么没在WG21讨论组里见过呢。
赵4老师 2013-12-02
  • 打赏
  • 举报
回复
通常就算捕获到了bad_alloc异常,也甭指望程序往下能不依赖人工干预自动解决问题,最终还是要通过人来手动解决问题。
ForestDB 2013-12-01
  • 打赏
  • 举报
回复
LS好问题,也许也是个悖论吧。
xdh0817 2013-11-30
  • 打赏
  • 举报
回复
引用 11 楼 ForestDB 的回复:
new的异常其实是个悖论 new都能抛异常,整个运行环境早就不像样了,估计也catch不住了。
我刚理解你的意思~ 假设new可以有异常,用catch来捕获。那C语言里的malloc函数呢,一般会对返回值判空,这有用吗?
ForestDB 2013-11-28
  • 打赏
  • 举报
回复
new的异常其实是个悖论 new都能抛异常,整个运行环境早就不像样了,估计也catch不住了。
Adol1111 2013-11-28
  • 打赏
  • 举报
回复
引用 9 楼 xdh0817 的回复:
[quote=引用 6 楼 Adol1111 的回复:] [quote=引用 5 楼 yshuise 的回复:] 用try....catch代码多丑陋啊! 用Rall技术就可漂亮的解决异常的问题。 在c++领域,本人曾经(在国内)爬上了巅峰的,见boost::lambda,说实话我已经看不懂我写的什么玩艺儿。 http://blog.csdn.net/yshuise/article/details/5919585
好厉害,膜拜下[/quote] 请教一个问题:我有多个函数,每个函数开头都要执行一段代码(有20行,主要是if语句,判断是否要调用两个函数)。如果把这段代码封装成一个宏,肯定是可以的。但我觉得宏里有两个函数,感觉很别扭,看上去不爽;如果把这段代码封装成另一个函数XXX,那么所有的函数都要调用一次这个XXX函数,那么开销就会变大,因为那段代码有if语句,不一定会会执行。 您给点建议呗~ [/quote]不想用宏的话也有其他方法的,当然效率上的话宏是最好的,不过你先写出来看看,具体怎么调整再说。
xdh0817 2013-11-28
  • 打赏
  • 举报
回复
引用 6 楼 Adol1111 的回复:
[quote=引用 5 楼 yshuise 的回复:] 用try....catch代码多丑陋啊! 用Rall技术就可漂亮的解决异常的问题。 在c++领域,本人曾经(在国内)爬上了巅峰的,见boost::lambda,说实话我已经看不懂我写的什么玩艺儿。 http://blog.csdn.net/yshuise/article/details/5919585
好厉害,膜拜下[/quote] 请教一个问题:我有多个函数,每个函数开头都要执行一段代码(有20行,主要是if语句,判断是否要调用两个函数)。如果把这段代码封装成一个宏,肯定是可以的。但我觉得宏里有两个函数,感觉很别扭,看上去不爽;如果把这段代码封装成另一个函数XXX,那么所有的函数都要调用一次这个XXX函数,那么开销就会变大,因为那段代码有if语句,不一定会会执行。 您给点建议呗~
xdh0817 2013-11-28
  • 打赏
  • 举报
回复
引用 5 楼 yshuise 的回复:
用try....catch代码多丑陋啊! 用Rall技术就可漂亮的解决异常的问题。 在c++领域,本人曾经(在国内)爬上了巅峰的,见boost::lambda,说实话我已经看不懂我写的什么玩艺儿。 http://blog.csdn.net/yshuise/article/details/5919585
好,有时间看看
yshuise 2013-11-28
  • 打赏
  • 举报
回复
引用 6 楼 Adol1111 的回复:
[quote=引用 5 楼 yshuise 的回复:] 用try....catch代码多丑陋啊! 用Rall技术就可漂亮的解决异常的问题。 在c++领域,本人曾经(在国内)爬上了巅峰的,见boost::lambda,说实话我已经看不懂我写的什么玩艺儿。 http://blog.csdn.net/yshuise/article/details/5919585
好厉害,膜拜下[/quote] 学了很久会发现,技术不是一切。
Adol1111 2013-11-28
  • 打赏
  • 举报
回复
引用 5 楼 yshuise 的回复:
用try....catch代码多丑陋啊! 用Rall技术就可漂亮的解决异常的问题。 在c++领域,本人曾经(在国内)爬上了巅峰的,见boost::lambda,说实话我已经看不懂我写的什么玩艺儿。 http://blog.csdn.net/yshuise/article/details/5919585
好厉害,膜拜下
yshuise 2013-11-28
  • 打赏
  • 举报
回复
用try....catch代码多丑陋啊! 用Rall技术就可漂亮的解决异常的问题。 在c++领域,本人曾经(在国内)爬上了巅峰的,见boost::lambda,说实话我已经看不懂我写的什么玩艺儿。 http://blog.csdn.net/yshuise/article/details/5919585
xdh0817 2013-11-28
  • 打赏
  • 举报
回复
引用 2 楼 Adol1111 的回复:
new一般抛出的是std::bad_alloc异常
我用了一个笨办法: a = 0; b = 0; class_a *p = NULL; try { p = new class_a();//可能有异常 a = 1; p->xx();//数据库接口,可能有异常 b = 1; } catch(SQLException &sqlex) { b = 0; } catch(exception &ex) { b = 0; } catch(...) { b = 0; } if( b == 1) {cout<<ok ; return 1;} if( a == 1) {cout<<数据库错误; return 2;} if( NULL != p){ delete p; p = NULL; cout<<class_a 构造函数异常;} return 3;
  • 打赏
  • 举报
回复
楼上正解。。
Adol1111 2013-11-28
  • 打赏
  • 举报
回复
new一般抛出的是std::bad_alloc异常
ri_aje 2013-11-28
  • 打赏
  • 举报
回复
catch (bad_alloc const&) 放在最上面.

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧