2014-02-06 3 views
1
class seh_exception : public std::exception { 
public: 
    seh_exception(UINT se_code, PEXCEPTION_POINTERS se_info); 
    seh_exception(const seh_exception& old); 
    ~seh_exception(); 

    const char *what() const; 
}; 

void translate_seh_exception(UINT se_code, PEXCEPTION_POINTERS se_info) { 
    throw seh_exception(se_code, se_info); 
} 

Теперь, что мне делать в конструкторе? Я не мог найти никакой информации о том, как долго будет существовать *se_info, а это значит, что я, вероятно, не должен просто сохранять se_info в частном поле для последующего использования - я должен его скопировать. А может и нет?Написание переводчика SEH

А что с what()? Предполагаю ли я заклинать базовую строку по требованию? Опять же, выделение памяти в конструкторе кажется не очень хорошей идеей в этом случае.

Я в настоящее время реализован его хранение se_code и se_info без глубокого копирования и генерация отформатированного сообщения в конструкторе, и он работает, хотя я не знаю, если это на самом деле должен работать.

Я намерен использовать его в сценарии «catch, log whatused, terminate».

+3

Я бы предположил, что вы пытаетесь что-то реализовать и посмотреть, где находится CATCH ... Pun неизбежно преднамеренно ... –

+0

@MatsPetersson Я уже писал это: с мелким копированием и форматированием сообщений в конструкторе. Оно работает. Но это не означает, что он работает * надежно *. –

+0

Я почти уверен, что 'что 'обычно решается с помощью переключателя, где каждый случай возвращает литеральную строку. Прошло немало времени с тех пор, как я работал над системами Windows, поэтому не могу помочь другим. Однако мой комментарий к моему комментарию состоял в том, что «Если вы показываете код», он дает гораздо более подробное представление о том, как он работает, и люди могут обнаружить ошибки/ошибки/проблемы. –

ответ

0

Для этого вам не нужен ваш собственный класс, вы можете просто выбросить PEXCEPTION_POINTERS. se_code также доступен по адресу se_info->ExceptionRecord->ExceptionCode.

Таким образом, самый простой обработчик;

void translate_seh_exception(UINT se_code, PEXCEPTION_POINTERS se_info) { 
    throw se_info; 
} 

Вы можете catch(PEXCEPTION_POINTERS se_info)

EXCEPTION_POINTERS гарантированно существует для продолжительности catch блока, который, как долго вам это нужно. Согласно документации, ваша функция транслятора вызывается один раз для каждого блока catch, то есть она должна повторно переводить исключение SEH для каждой функции, содержащей блок try/catch.

Смежные вопросы