Как достать std::exception из PEXCEPTION_POINTERS
От: Caracrist https://1pwd.org/
Дата: 15.09.22 12:02
Оценка:
Находясь в __except мне нужно понять если бросили именно std::exception, можно ли это сделать нагло кастанув pExceptionObject в std::exception* и потом сделать dynamic_cast в тот же тип?

Типа такого:
bool ItIsAnStdException(std::exception * pStdEx)
{
    return (dynamic_cast<std::exception *>(pStdEx) != 0);
}
TryExtractSTDException(int code, PEXCEPTION_POINTERS exceptionPointers)
{
    if (code == 0xE06D7363) // created with c++ throw
    {
        EHExceptionRecord pThisException = (EHExceptionRecord *)exceptionPointers->ExceptionRecord->ExceptionInformation[6];
        std::exception * pStdEx = (std::exception *)pThisException ->params.pExceptionObject;
        if (ItIsAnStdException(pStdEx))
        {
            DebugOutput(pStdEx->what());
        }
    }
    // more logic
}
__try
{
// throw std::exception();
// throw 1;
// throw std::invalid_argument();
// ((string*)0)->clear();
}
__except(TryExtractSTDException(GetExceptionCode(), GetExceptionInformation()))
{
// some logic
}


Фактически, у меня в руках void* и мне нужно понять является ли он типом std::exception или его наслендиком...
~~~~~
~lol~~
~~~ Single Password Solution
Re: Как достать std::exception из PEXCEPTION_POINTERS
От: Stanislav V. Zudin Россия  
Дата: 15.09.22 13:44
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Находясь в __except мне нужно понять если бросили именно std::exception, можно ли это сделать нагло кастанув pExceptionObject в std::exception* и потом сделать dynamic_cast в тот же тип?


C>Фактически, у меня в руках void* и мне нужно понять является ли он типом std::exception или его наслендиком...


Неа, скорее всего без шансов.
SEH и С++ исключения — два различных механизма.

Ты можешь включить подходящую опцию, чтобы в catch(...) ловить структурные исключения, но уже без детальной информации. Подробнее тут

Либо использовать вложенную функцию, где ловить std::exception&, а внешняя функция будет ловить структурные исключения.
_____________________
С уважением,
Stanislav V. Zudin
Re: Как достать std::exception из PEXCEPTION_POINTERS
От: flаt  
Дата: 16.09.22 04:24
Оценка: 17 (2)
https://github.com/icestudent/ontl/blob/master/ntl/nt/exception.hxx#L347 record
https://github.com/icestudent/ontl/blob/master/ntl/nt/exception.hxx#L1454 cxxrecord
https://github.com/icestudent/ontl/blob/master/ntl/nt/exception.hxx#L724 throwinfo

http://workblog.pilin.name/2014/03/decoding-parameters-of-thrown-c.html

Или вот оригинал: https://github.com/microsoft/STL/blob/main/stl/src/excptptr.cpp
Отредактировано 16.09.2022 4:28 flаt . Предыдущая версия .
Re[2]: Как достать std::exception из PEXCEPTION_POINTERS
От: _NN_ www.nemerleweb.com
Дата: 19.09.22 11:46
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Неа, скорее всего без шансов.

SVZ>SEH и С++ исключения — два различных механизма.

Как бы да, но в MSVC не совсем
Ссылки на реализацию тут уже приложили.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.