Отчет об ошибках SEH
У меня есть программа 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;
}
Спасибо, Пол
Изменить: если 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;
}
В этом случае программа должна иметь аварийное завершение, и исключение должно быть передано в ОС, чтобы она могла с ней работать. Это верно?
2 ответа
Если вы вызовете исключение в своем фильтре, вы снова окажетесь в методе фильтра. Ваше исключение будет обработано тем же блоком __except.
Но нет проблем с использованием другого блока __try __except в методе фильтра.
К сожалению, я не могу дать вам никаких ссылок на это. Я попробовал это сам, и вы тоже можете. Просто делите деление на ноль.
Обычно я не использую SEH, но в те несколько раз, когда я делал это, у меня не было проблем с выдачей исключения в методе фильтра. Но я не нашел ничего в MSDN, когда я искал это.
Есть много вещей, которые вы должны быть осторожны при этом. Когда ваш обработчик SEH работает, ваш процесс находится в полностью неизвестном состоянии, и некоторые вещи, которые вы пытаетесь сделать, чтобы проинструктировать пользователя, могут дать сбой. Например, если исключение было переполнением стека, вы можете сделать очень мало. Если вы используете здесь интерфейс пользовательского интерфейса (скажем, MFC), он может быть поврежден или находиться в несогласованном состоянии, потому что ваше приложение могло произойти сбой в середине какой-то важной операции. Если ваше приложение является многопоточным, вам нужно знать, что эти другие потоки все еще будут работать, когда вы попадете в этот фильтр, и обработка может помочь.
Если вам действительно нужно это сделать, один из альтернативных подходов - создать сторожевой процесс для этого.