尝试除语句
Microsoft 专用
下面的语法描述尝试除语句的:
__try
{
// guarded code
}
__except ( expression )
{
// exception handler code
}
备注
尝试除外 语句是 Microsoft 对启用目标应用程序在控件的 C 和 C++ 语言,用于正常终止程序执行期间的事件发生。 此类事件调用异常和事务与异常调用结构化异常处理机制。
有关相关信息,请参见 尝试最终语句。
异常可能相关硬件或软件。 即使应用程序无法从硬件或软件异常完全还原,结构化异常处理使您可以显示错误信息并使应用程序的内部状态帮助诊断问题。 这对于不能轻松地重现的间歇性问题特别有用。
备注
结构化异常处理与 C 和 C++ 的 Win32 使用源文件。但是,对于 C++ 不专门设计。可以确保代码是可移植使用 C++ 异常处理。此外, C++ 异常处理更为灵活,因为它可以任何类型的异常。对于 C++ 程序,建议您使用异常处理机制 (尝试 " 被引发 语句) 的 C++。
复合语句,在 __try 子句为体或将控制的部分中。 在 __except 子句后的复合语句是异常处理程序。 ,如果在所控制的正文时,执行引发处理程序指定要执行的一组操作。 执行如下所示:
所控制的部分执行。
如果异常不在所控制的部分的执行过程中发生,则继续执行该语句在 __except 子句后。
如果在所控制的部分的执行过程中发生或任何实例所控制的部分调用, __except 表达式 (称为 筛选器 表达式) 计算和值确定异常的处理方式。 有三个值:
EXCEPTION_CONTINUE_EXECUTION (– 1) 异常关闭。 继续执行在异常发生的点。
EXCEPTION_CONTINUE_SEARCH (0) 异常未被识别。 继续搜索堆栈处理程序,首先包含 尝试除外 语句,然后使用下一个高优先级的处理程序。
EXCEPTION_EXECUTE_HANDLER (1) 异常被识别。 对于异常处理程序传输控件通过执行 __except 复合语句,然后继续执行,在 __except 块之后。
由于除了 表达式计算为 c. 表达式,它仅限于单个值、条件表达式运算符或逗号运算符。 如果需要更多个处理,表达式可以调用返回列表的三个值之一上面的实例。
每个应用程序可能具有自己的异常处理程序。
它是无效的阅读本文档 __try 语句,但是,有效跳出一。 ,如果处理在执行 尝试除外 语句元,终止异常未调用处理程序。
有关更多信息,请参见知识库文章 Q315937:如何:用于在 Visual C++ 应用程序的堆栈溢出。
__leave 关键字
__leave 关键字在 try-except 语句中的控制的节中有效的,因此,其效果是跳转到控制的末尾。 继续执行在第一个语句在异常处理程序后处理。
goto 语句还可以跳出所控制的部分,因此,它不会造成性能下降,它在 try-finally 语句执行,因为展开的堆栈不会发生。 但是,建议您使用 __leave 关键字而不是 goto 语句,因为您不大可能出现一个编程错误,如果已控制的部分是用或复杂。
结构化异常处理内部函数
结构化异常处理提供了可用于 尝试除外 语句的两个内部函数: GetExceptionCode 和 GetExceptionInformation。
GetExceptionCode 返回代码 (32 位整数) 异常。
内部函数 GetExceptionInformation 返回指向包含有关异常的结构附加信息。 通过此指针,您可以在硬件异常时存在的设备状态。 结构如下所示:
struct _EXCEPTION_POINTERS {
EXCEPTION_RECORD *ExceptionRecord,
CONTEXT *ContextRecord }
指针类型EXCEPTION_RECORD 和 __上下文 在包含文件 EXCPT.H. 定义。
可以使用在异常处理程序中 GetExceptionCode 。 但是,您只能使用 GetExceptionInformation 在异常筛选器表达式中。 它指向的信息通常位于堆栈并且不再可用,当控件传输到异常处理程序时。
内部函数 AbnormalTermination 在终止处理程序内可用。 ,如果 try-finally 语句的主体按顺序,停止则返回 0。 其他情况下,则返回 1。
EXCPT.H 定义几个替代名称。这些内部:
GetExceptionCode 与 _exception_code 等效
GetExceptionInformation 与 _exception_info 等效
AbnormalTermination 与 _abnormal_termination 等效
示例
// exceptions_try_except_Statement.cpp
// Example of try-except and try-finally statements
#include <stdio.h>
#include <windows.h> // for EXCEPTION_ACCESS_VIOLATION
#include <excpt.h>
int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep) {
puts("in filter.");
if (code == EXCEPTION_ACCESS_VIOLATION) {
puts("caught AV as expected.");
return EXCEPTION_EXECUTE_HANDLER;
}
else {
puts("didn't catch AV, unexpected.");
return EXCEPTION_CONTINUE_SEARCH;
};
}
int main()
{
int* p = 0x00000000; // pointer to NULL
puts("hello");
__try{
puts("in try");
__try{
puts("in try");
*p = 13; // causes an access violation exception;
}__finally{
puts("in finally. termination: ");
puts(AbnormalTermination() ? " \tabnormal" : "\tnormal");
}
}__except(filter(GetExceptionCode(), GetExceptionInformation())){
puts("in except");
}
puts("world");
}
Output
hello
in try
in try
in filter.
caught AV as expected.
in finally. termination:
abnormal
in except
world
特定于 Microsoft 的结尾