关于函数范围异常处理

ahao 2004-06-21 11:43:57
比如下面的代码:

class A
{
public:
A()
{
throw ae();
}

class ae{};
};

class B
{
public:
B()
try : _sp_a( new A )
{
}
catch(A::ae& /*e*/)
{
int a = 0; // 会到这里
}

private:
shared_ptr<A> _sp_a;
};


void CTestsppoppDlg::OnBnClickedButton1()
try
{
B b;
}
catch(A::ae& /*e*/)
{
int b = 0; // 为什么会到这里?
};

为什么会进第二个catch?
我怎么才能捕获初始化列表里抛的异常,不让继续抛?


...全文
157 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ahao 2004-06-23
  • 打赏
  • 举报
回复
传的是引用,怎么能delete?
lhj0532 2004-06-23
  • 打赏
  • 举报
回复
try : _sp_a( new A )
{
}
catch(A::ae& ex)
{
int a = 0; // 会到这里
delete ex; // 试验试验
}
lianglp 2004-06-23
  • 打赏
  • 举报
回复
学习。。。
ahao 2004-06-23
  • 打赏
  • 举报
回复
抛出的是ae,我奇怪的是,我catch到了,为什么还会进第二个catch

没少大括号,我的语法是对的
lhj0532 2004-06-23
  • 打赏
  • 举报
回复
ae是一个内部类吧?throw ae();是跑出一个什么东西?不是类ae的一个对象吗?捕捉到的不就是A::ae&(ae的一个对象)?
再就是
B(){//少了大括号
try : _sp_a( new A )
{
}
catch(A::ae& /*e*/)
{
int a = 0; // 会到这里
}
}
ahao 2004-06-23
  • 打赏
  • 举报
回复
不是这样的,而且这里也没有new出来的对象,在new A的时候已经抛异常了

lhj0532 2004-06-23
  • 打赏
  • 举报
回复
我虽然没在VC里这样用过,但我在C#例如次抛错过,我感觉如果你想把一场终止,需要把new出来的错误对象delete掉
ahao 2004-06-23
  • 打赏
  • 举报
回复
up
ahao 2004-06-22
  • 打赏
  • 举报
回复
up
ahao 2004-06-21
  • 打赏
  • 举报
回复
放函数里的话我还会来问?
tgb 2004-06-21
  • 打赏
  • 举报
回复
不懂
QunKangLi 2004-06-21
  • 打赏
  • 举报
回复
你的头一个try居然将初使化列表一起包含进去了而没语法错?高人!
不用初使化列表,直接用=在构造函数中赋值,这时可安全地用try进行捕获。
ahao 2004-06-21
  • 打赏
  • 举报
回复
阿朴
hudan 2004-06-21
  • 打赏
  • 举报
回复
gz
ahao 2004-06-21
  • 打赏
  • 举报
回复
up

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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