Письменный переводчик SEH

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 в частном поле для дальнейшего использования — я должен глубоко скопировать его. А может и нет?

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

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

Я намерен использовать его в сценарии «поймай, запиши, что случилось, прекратить».

1

Решение

Вам не нужен ваш собственный класс, чтобы достичь этого, вы можете просто бросить 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 блок.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]