使用异常处理程序

【勇芳软件工作室】汉化HomePreviousNext

以下示例显示了可以处理无效指针并返回NULL的标准C 的strcpy函数的版本。

请注意,此异常处理程序旨在处理访问冲突异常,但如果发生其他类型的异常则不适用。因此,示例中的过滤器表达式使用GetExceptionCode函数在执行处理程序之前检查异常类型。这使得如果发生其他类型的异常,系统将继续搜索适当的处理程序。

还要注意,在尝试 - 语句的尝试块中使用返回语句没有问题。这与在尝试 - 最后语句的尝试块中使用返回不同,导致尝试块异常终止。

LPTSTR SafeStrcpy(LPTSTR lpszString1,LPTSTR lpszString2){

尝试{

return strcpy(string1, string2);

}

except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?

EXCEPTION_EXECUTE_HANDLER :

EXCEPTION_CONTINUE_SEARCH ) {

return NULL;

}

}

以下示例显示嵌套的尝试 - 最后尝试 - 语句的交互。RaiseException函数在尝试 - 异常处理程序的守卫体内的尝试 - 最后终止处理程序的守卫正文中引发异常。该异常导致系统评估FilterFunction函数,该函数的返回值又会导致异常处理程序被调用。然而,在执行异常处理程序块之前,执行终止处理程序的最后块,因为控制流已经离开终止处理程序的尝试块。

DWORD FilterFunction(){

printf("1 "); //先打印

return EXCEPTION_EXECUTE_HANDLER;

}

VOID主(VOID){

尝试{

尝试{

RaiseException(1, //异常代码

0, //可持续异常

0, NULL); //没有参数

}

最后{

printf("2 ") //这是打印第二

}

}

except(FilterFunction()){

printf("3\n"); //这是最后打印的

}

}