欢迎大家来讨论:Windows vc下 SEH 和 C++ 的 异常有什么区别?

penter 2003-06-30 12:52:43
谢谢
...全文
105 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
penter 2003-07-02
  • 打赏
  • 举报
回复
谢谢楼上,

个人感觉,SEH中__finally的存在,就是为了 用来 做清理工作的,所以对有析构函数的类的对象的 栈解退反而不支持;
In355Hz 2003-07-01
  • 打赏
  • 举报
回复
我说一点我的理解:

SEH 和 C++ exception handling 的区别是 C++ exception handling 是为 C++ 设计的,知道如何正确的处理类实例,例如

class some_class
{
public:
some_class() { cout << "some_class constructed." << endl; }
~some_class() { cout << "some_class destructed." << endl; }
};

int _tmain(int argc, _TCHAR * argv[], _TCHAR **envp)
{
int div = 0;

// 如下语句中,object 在离开 try 块时被正确的析构
try
{
some_class object;

cout << "throwing exception" << endl;

int a = 16 / div;

cout << "a = " << a << endl;
}
catch(...)
{
cout << "in catching C++ exception" << endl;
}

return 0;
}

此外,我试过了 Debug 和 Release ,在 VC6.0 + sp5 下得到的是同样的输出,
penter 2003-07-01
  • 打赏
  • 举报
回复
to lygfqy(风清扬) :

您说的“设置catch中的异常过滤器为自己的就可以了”,是不是指结构化的异常处理?
我会试试的;

没有比较充分的考虑和尝试就贸然发问,给大家添麻烦了;不过依然希望可以得到比较全面和权威的答案;

谢谢各位!
lygfqy 2003-07-01
  • 打赏
  • 举报
回复
具体的地方我也不是很清楚,这些知识也是平时零散的积累而来,真要理清个头绪还不容易
不过vc6.0的开发手册上好像有过一些,你去翻翻看(我的书是同学的,看了也就还了,现在也找不到)。要想系统执行自己的异常处理就是设置catch中的异常过滤器为自己的就可以了
penter 2003-07-01
  • 打赏
  • 举报
回复
结构化异常处理中,对有 析构函数的类的使用有限制:

有析构函数的类的对象不可以出现在__try 所在的函数中;
penter 2003-07-01
  • 打赏
  • 举报
回复
up;
penter 2003-07-01
  • 打赏
  • 举报
回复
自己UP,三天后结,欢迎继续讨论!!
matlab7 2003-07-01
  • 打赏
  • 举报
回复
学习……
penter 2003-07-01
  • 打赏
  • 举报
回复
回复人: CQP(悄悄的我走了,正如我悄悄的来) ( ) 信誉:100 2003-7-1 12:19:25 得分:10



关于debug和release的不同的两点讨论 - (1.5kg, shanghai, 15:39 2002-12-20)

======================================================

在使用VC开发软件的过程中,正当要享受那种兴奋的时候突然发现:release与debug运行结果不一致,甚至出错,而release又不方便调试,真的是当头一棒啊,可是疼归疼,问题总要解决,下面将讲述一下我的两点经验,看看是不是其中之一:


1. 变量。
大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc,而release的赋值近似于随机(我想是直接从内存中分配的,没有初始化过,但debug为什么不是0xff或0x00或其他什么的就不得而知了)。这样就明确了,如果你的程序中的某个变量没被初始化就被引用,就很有可能出现异常:用作控制变量将导致流程导向不一致;用作数组下标将会使程序崩溃;更加可能是造成其他变量的不准确而引起其他的错误。所以在声明变量后马上对其初始化一个默认的值是最简单有效的办法,否则项目大了你找都没地方找。代码存在错误在debug方式下可能会忽略而不被察觉到,如debug方式下数组越界也大多不会出错,在release中就暴露出来了,这个找起来就比较难了:( 还是自己多加注意吧

2. 自定义消息的消息参数。
MFC为我们提供了很好的消息机制,更增加了自定义消息,好处我就不用多说了。这也存在debug跟release的问题吗?答案是肯定的。在自定义消息的函数体声明时,时常会看到这样的写法:afx_msg LRESULT OnMessageOwn(); 当你在多线程或进程间使用了消息传递时就会导致无效句柄之类的错误。这个原因就是消息体的参数没有添加,即应该写成:afx_msg LRESULT OnMessageOwn(WPARAM wparam, LPARAM lparam); (具体原因我也不太清楚,是不是因为调用时按着默认的参数多分配了WPARAM+LPARAM的空间而破坏了应用程序的内存空间?还请高手多指点)


避免的方法:
1. 注意变量的初始化
2. 自定义消息的标准写法
3. 使用调试语句TRACE等时使用后最好注释掉
4. 尽量使用try - catch(...)

======================================================



penter 2003-06-30
  • 打赏
  • 举报
回复
to lygfqy(风清扬) :

我一直没怎么在意release ,debug的区别,您能不能帮我指点个查资料的地儿?

还有,无论怎么样,系统为什么不执行我的 异常 处理,自己另搞一套?就好象我的异常处理白写的似的;
zhucde 2003-06-30
  • 打赏
  • 举报
回复
study
lygfqy 2003-06-30
  • 打赏
  • 举报
回复
在release模式中是不会去检查内存的使用和堆栈的合法性
建议你先看看release和debug的区别
要下班了,明天再帮你 看看吧
zyoujie 2003-06-30
  • 打赏
  • 举报
回复
up
penter 2003-06-30
  • 打赏
  • 举报
回复
还有,零指针赋值 是有CPU引发一个 访问错误,那么就该是操作系统来捕捉了,可在C++异常里面,它到底该是标准异常的什么类型?

penter 2003-06-30
  • 打赏
  • 举报
回复
各位老大,你们说的书我现在就拿着呢!MSDN我也有,我是觉得越看越糊涂才问的,
怎么这么答啊?

比如,这段代码:
int p = 0;
try
{
int ss = 3/p;
}
catch(...)
{
AfxMessageBox( "error" );
}

为什么在DEBUG模式下可以按我的要求运行,但release下却是系统的提示框?
lygfqy 2003-06-30
  • 打赏
  • 举报
回复
就是嘛,看看书比什么都强
rivershan 2003-06-30
  • 打赏
  • 举报
回复
SEH:Structured Exception Handling
C++ Exception
SZSGL 2003-06-30
  • 打赏
  • 举报
回复
看看书吧,现在也不是一句两句就能说清的。
cwanter 2003-06-30
  • 打赏
  • 举报
回复
windows核心编程第25章

16,551

社区成员

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

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

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