SEH 可以在 C++ 程序中使用

转载自http://blog.programfan.com/article.asp?id=9864

首先声明的是, C++ 中的异常处理机制是建立在 Windows 平台上的 SEH 机制之上,所以 SEH 当然可以在 C++ 程序中使用。不过“阿愚”多次强调过,我们平常一般狭义上的 SEH 都是指 try-except 和 try-finally 异常机制,而它们是给 C 语言( VC 环境)编写 windows driver 而设计的,所以 SEH 主要应该在 C 程序中被使用,而 C++ 程序则应该使用 try-catch 机制的 C++ 异常处理模型( micorsoft 的 MSDN 一直强烈建议程序员遵循此规则)。但是, SEH 到底能在 C++ 程序中使用吗?“当然可以,肯定可以”,其实在一开始阐述 Windows 平台多种异常机制之间的关系时,就已经清楚地表明了这一点。

这篇文章系统地来看看 SEH 在 C++ 程序中的各种使用情况。

先来一个简单的例子

其实简单的例子,就是把以前的使用 SEH 机制的 C 程序,改称 C++ 程序,看它能正常编译和运行否?什么意思,很简单,就是把原来的 .c 程序的扩展名改为 .cpp 文件,也即此时 VC 编译器会采用 C++ 语言来编译此程序(这也即为 C++ 程序了)。朋友们试试吧!代码如下:

// 注意,这是 C++ 程序,文件名为: SEH-test.cpp

#include "stdio.h"

void test()

{

int* p = 0x00000000; // pointer to NULL

__try

{

puts("in try");

__try

{

puts("in try");

// causes an access violation exception;

// 导致一个存储异常

*p = 13;

puts(" 这里不会被执行到 ");

}

__finally

{

puts("in finally");

}

puts(" 这里也不会被执行到 ");

}

__except(puts("in filter 1"), 0)

{

puts("in except 1");

}

}

void main()

{

puts("hello");

__try

{

test();

}

__except(puts("in filter 2"), 1)

{

puts("in except 2");

}

puts("world");

}

是不是能编译通过,而且运行结果也和以前 c 程序的运行结果完全一致,如下:

hello

in try

in try

in filter 1

in filter 2

in finally

in except 2

world

Press any key to continue

来一个真正意义上的 C++ 程序,且使用 SEH 机制

也许很多程序员朋友对上面的例子不以为然,觉得它说明不了什么问题。好的,现在我们来看一个 真正意义上的 C++ 程序,且使用 SEH 机制。什么是真正意义上的 C++ 程序,当然是采用了面向对象技术。看例子吧!代码如下(其实就是在上面程序的基础上加了一个 class ):

// 注意,这是 C++ 程序,文件名为: SEH-test.cpp

#include "stdio.h"

class A

{

public:

void f1() {}

void f2() {}

};

void test1()

{

A a1;

A a2,a3;

a2.f1();

a3.f2();

}

void test()

{

int* p = 0x00000000; // pointer to NULL

__try

{

// 这里调用 test1 函数,它函数内部会创造 object

// 应该属于 100% 的 C++ 程序了吧!

test1();

puts("in try");

__try

{

puts("in try");

// causes an access violation exception;

// 导致一个存储异常

*p = 13;

puts(" 这里不会被执行到 ");

}

__finally

{

puts("in finally");

}

puts(" 这里也不会被执行到 ");

}

__except(puts("in filter 1"), 0)

{

puts("in except 1");

}

}

void main()

{

puts("hello");

__try

{

test();

}

__except(puts("in filter 2"), 1)

{

puts("in except 2");

}

puts("world");

}

总结

通过以上实践得知, SEH 的确可以在 C++ 程序中使用,而且 SEH 不仅可以在 C++ 程序中使用;更进一步, SEH 异常机制( try-except 和 try-finally )还可以与 C++ 异常处理模型( try-catch ),两者在同一个 C++ 程序中混合使用,这在下一篇文章中接着讨论。

但问题是,微软 MSDN 的忠告( C 程序中使用 try-except 和 try-finally ;而 C++ 程序则应该使用 try-catch ),这岂不是完全属于吓唬人吗?非也!非也!微软的建议一点也没有错, SEH 与 C++ 异常处理机制混合使用时,的确有一定的约束(虽然,平时我们很少关心这一点),这同样也在下一篇文章中详细接着讨论, 程序员朋友们,继续吧!

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值