本文共 1263 字,大约阅读时间需要 4 分钟。
结构化异常处理SEH(全称Structured Exception Handling),是Windows操作系统所提供的对错误或异常的处理机制,是Windows操作系统的一个重要组成部分。
Q : 在windows系统中,我们在开发应用程序时应该使用结构化异常还是C++异常?
A : SEH是操作系统所提供的便利,它在任何语言中都可以使用。而C++异常处理只有在编写C++代码时才可以使用。如果读者在开发C++应用程序,那就应该使用C++异常,而不是结构化异常。理由是C++异常是语言的一部分,编译器知道什么是一个C++对象。这也就意味着编译器会自动生成代码来调用C++对象的析构函数,保证对象的释放。
我们应该了解Microsoft 的Visual C++编译器使用操作系统的结构化异常机制来实现C++异常处理机制。所以在创建一个C++ try 块时,编译器会为我们生成一个SEH __try块。C++的catch语句对应SEH异常过滤程序,catch 块中的代码则对应SEH __except 块中的代码。而编译器也会为C++ throw语句生成对WindowsRaiseException函数的调用。throw语句所使用的变量则成为RaiseException的附加参数。
下面这段代码有助于更清楚地了解整个过程。
//该函数使用C++异常处理
void ChunkyFunky()
{
try
{
// try body
....
throw 5;
}
catch( int x)
{
// catch body
.....
}
....
}
//该函数则演示了C++编译器生成的对应的结构化异常处理代码
void ChunkyFunky()
{
__try
{
// try body
......
RaiseException(Code = 0xE06D7363, Flag = EXCEPTION_NONCONTINUABLE, Args = 5);
}
__except( (ArgType == Integer) ? EXCEPTION_EXECUTE_HANDLE : EXCEPTION_CONTINUE_SEARCH )
{
// catch body
.....
}
.....
}
说明:
传给RaiseException 的异常代码为0xE06d7363,这是Visual C++开发组选择用来抛出一个C++异常的软件异常代码。
Microsoft Visual Studio的调试器为异常调试提供了出色的支持。当进程中的某个线程抛出异常,操作系统会马上通知调试器(如果调试器已经附着)。这个通知呗称为“首次机会通知”。调试器将响应这个通知,促使线程寻找异常过滤程序。如果所有的异常过滤程序都返回EXCEPTION_CONTINUE_SEARCH,操作系统会给调试器一个“最后机会通知”。这两个通知的存在使得软件开发人员能更好地控制异常调试的过程。
参考文献:Windows 核心编程(第五版)
转载地址:http://hzlxi.baihongyu.com/