全部博文(668)
分类:
2008-08-07 09:05:49
try-except和try-finally组合使用
try-except和try-finally可以组合起来使用,它们可以是平行线性的关系,也可以是嵌套的关系。而且不仅是try-except语句中可以嵌套try-finally语句;同时try-finally语句中也可以嵌套try-except语句。所以它们的使用起来非常灵活,请看下面的代码:
// 例程1,try-except语句与try-finally语句平行关系
#include
void main()
{
puts("hello");
__try
{
int* p;
puts("__try块中");
// 下面抛出一个异常
p = 0;
*p = 25;
}
__except(1)
{
puts("__except块中");
}
__try
{
}
__finally
{
puts("__finally块中");
}
puts("world");
}
// 例程2,try-except语句中嵌套try-finally
#include
void main()
{
puts("hello");
__try
{
__try
{
int* p;
puts("__try块中");
// 下面抛出一个异常
p = 0;
*p = 25;
}
__finally
{
// 这里会被执行吗
puts("__finally块中");
}
}
__except(1)
{
puts("__except块中");
}
puts("world");
}
// 例程3,try-finally语句中嵌套try-except
#include
void main()
{
puts("hello");
__try
{
__try
{
int* p;
puts("__try块中");
// 下面抛出一个异常
p = 0;
*p = 25;
}
__except(1)
{
puts("__except块中");
}
}
__finally
{
puts("__finally块中");
}
puts("world");
}
try-except和try-finally组合使用时,需注意的事情
在
// 例程1,一个__try块,两个__except块
#include
void main()
{
puts("hello");
__try
{
int* p;
puts("__try块中");
// 下面抛出一个异常
p = 0;
*p = 25;
}
__except(1)
{
puts("__except块中");
}
// 这里有语法错误
__except(1)
{
puts("__except块中");
}
puts("world");
}
// 例程2,一个__try块,两个__finally块
#include
void main()
{
puts("hello");
__try
{
puts("__try块中");
}
__finally
{
puts("__finally块中");
}
// 这里有语法错误
__finally
{
puts("__finally块中");
}
puts("world");
}
// 例程3,一个__try块,对应一个__finally块和一个__except块
#include
void main()
{
puts("hello");
__try
{
int* p;
puts("__try块中");
// 下面抛出一个异常
p = 0;
*p = 25;
}
__finally
{
puts("__finally块中");
}
// 这里有语法错误
__except(1)
{
puts("__except块中");
}
puts("world");
}
温过而知新
这里给出最后一个简单的try-except和try-finally相结合的例子,让我们温过而知新。代码如下(这是MSDN中的例程):
#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");
}
上面的程序运行结果如下:
hello
in try
in try
in filter 1
in filter 2
in finally
in except 2
world
Press any key to continue
下面用图表描述一下上面例程运行时的执行流程,如下图所示。
总结
(1) try-except和try-finally可以组合起来使用,它们可以是平行线性的关系,也可以是嵌套的关系。而且不仅是try-except语句中可以嵌套try-finally语句;同时try-finally语句中也可以嵌套try-except语句。
(2) 一个__try块只能是拥有一个__except块或一个__finally块相对应。
至此,关于SEH的__try、__except、__finally、__leave模型已经基本阐述完毕,但是主人公阿愚认为,有关SEH模型机制,还有一个非常关键的内容没有阐述到,那就是SEH与C++异常处理模型可以结合使用吗?如果可以的话?它们组合使用时,有什么限制吗?或带来什么不良后果吗?
大家知道,提供的SEH机制虽然主要是应用于的程序,以便第三厂商开发出高效的设备驱动程序来。但是__try、__except、__finally、__leave模型同样也可以在C++程序中使用,这在MSDN中已经提到,虽然还是建议,在C++程序中尽量采用C++的异常处理模型。