[英]SEH error reporting
我有一个Visual Studio 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;
}
在这种情况下,程序应具有异常终止功能,并且应将异常传递给操作系统以进行处理。 那是对的吗?
如果在过滤器中引发异常,则将再次使用filter方法。 您的异常将由相同的__except块处理。
但是在您的过滤器方法中使用另一个__try __except块没有问题。
不幸的是,我无法给您任何参考。 我只是自我尝试,您也可以。 只需将其除以零即可。
通常,我不使用SEH,但是有几次我没有提出在filter方法中引发异常的问题。 但是当我寻找这个时,我没有在msdn中找到任何东西。
执行此操作时,需要注意很多事项。 当您的SEH处理程序运行时,您的进程处于完全未知的状态,并且您尝试指示用户的某些操作可能会失败。 例如,如果异常是堆栈溢出,那么您在这里几乎无能为力。 如果您在此处使用UI框架(如MFC),则可能是因为某些重要操作导致应用崩溃而导致应用崩溃或处于不一致状态。 如果您的应用程序是多线程的,则需要知道进入此过滤器时那些其他线程仍将在运行,并且处理时要格外小心。
如果您确实需要执行此操作,则另一种方法是执行监视程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.