我有一个Visual 2008 C++程序,该程序被包装在一个__try/__except块中,以捕获任何SEH异常。异常筛选器创建错误日志,并向用户提供关于如何提交缺陷报告的详细说明。
过滤器中的代码是否需要包装在另一个__try/__except块中?如果没有,如果例外会发生什么?若然,应如何处理?
static int MyFilter( struct _EXCEPTION_POINTERS* ep )
{
/*
Code to log the exception information, and instruct the user
on how to submit a defect report. Should this be in another
__try/__except block?
*/
return EXCEPTION_EXECUTE_HANDLER;
}
int WINAPI _tWinMain( HINSTANCE hInstance,
HINSTANCE /*hPrevInstance*/,
LPTSTR lpstrCmdLine,
int nCmdShow )
{
int result = 0;
__try
{
result = Execute( hInstance, lpstrCmdLine, nCmdShow );
}
__except( MyFilter( GetExceptionInformation() ) )
{
// empty
}
return 0;
}谢谢,PaulH
编辑:如果MyFilter引发异常,那么我将进入无限异常循环。因此,它看起来确实需要__try/__except处理。我要做的是:
static int MyFilter( struct _EXCEPTION_POINTERS* ep )
{
__try
{
/*
Code to log the exception information, and instruct the user
on how to submit a defect report.
*/
// cause an exception
int x = 0, y = 1 / x;
}
__except( EXCEPTION_EXECUTE_HANDLER ) { /*empty*/ }
return EXCEPTION_EXECUTE_HANDLER;
}在这种情况下,程序应该有一个异常终止和异常应该被传递给操作系统来处理。对吗?
发布于 2011-04-06 16:57:37
如果在筛选器中引发异常,将再次出现在筛选器方法中。您的异常将由同一个__except块处理。
但是在过滤器方法中使用另一个__try __except块没有问题。
不幸的是,我不能给你任何这方面的参考。我只是自己试了一下,你也可以。把除法强制为零。
通常我不使用SEH,但是在我使用SEH的几次中,在过滤器方法中引发异常没有问题。但是当我寻找这个时,我没有在msdn中找到任何东西。
https://stackoverflow.com/questions/5569471
复制相似问题