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
без какого-либо глубокого копирования и генерации форматированного сообщения в конструкторе, и это работает, хотя я не знаю, является ли это на самом деле предполагаемый работать.
Я намерен использовать его в сценарии «поймай, запиши, что случилось, прекратить».
Вам не нужен ваш собственный класс, чтобы достичь этого, вы можете просто бросить 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
блок.
Других решений пока нет …