Отчет об ошибках SEH - PullRequest
       27

Отчет об ошибках SEH

0 голосов
/ 06 апреля 2011

У меня есть программа 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;
}

В этом случае программа должна иметь аварийное завершение, и исключение должно быть передано в ОС для ее обработки. Это правильно?

Ответы [ 2 ]

0 голосов
/ 06 апреля 2011

Есть много вещей, с которыми вам нужно быть осторожными при этом. Когда ваш обработчик SEH работает, ваш процесс находится в полностью неизвестном состоянии, и некоторые вещи, которые вы пытаетесь сделать, чтобы проинструктировать пользователя, могут дать сбой. Например, если исключением было переполнение стека, вы можете сделать очень мало. Если вы используете здесь среду пользовательского интерфейса (скажем, MFC), она может быть повреждена или находиться в несогласованном состоянии, потому что ваше приложение могло произойти сбой в середине какой-то важной операции. Если ваше приложение является многопоточным, вам нужно знать, что эти другие потоки все еще будут работать, когда вы попадете в этот фильтр, и об обработке, которая может позаботиться.

Если вам действительно нужно это сделать, один из альтернативных подходов - создать сторожевой процесс для этого.

0 голосов
/ 06 апреля 2011

Если вы вызовете исключение в своем фильтре, вы снова окажетесь в методе фильтра. Ваше исключение будет обработано тем же блоком __except.
Но нет никаких проблем в использовании другого блока __try __except в методе фильтра.
К сожалению, я не могу дать вам никаких ссылок на это. Я попробовал это сам, и вы тоже можете. Просто делите деление на ноль.
Обычно я не использую SEH, но в те несколько раз, когда я делал это, у меня не было проблем с выдачей исключения в методе фильтра. Но я не нашел ничего в MSDN, когда искал это.

...