Предполагая, что вы не можете просто устранить причину возникновения кода, генерирующего исключение (возможно, из-за того, что у вас нет исходного кода для этой конкретной библиотеки и, возможно, из-за того, что вы не можете настроить входные параметры до того, как они вызовут проблему) .
Вы должны перепрыгнуть через несколько обручей, чтобы сделать эту работу так, как вам хочется, но это можно сделать.
Сначала вам нужно установить функцию перевода Structured Exception Handling, вызвав _set_se_translator()
(см. здесь ), затем вы можете проверить код, который вы передали, когда возникает исключение SEH, и выдать соответствующий C ++ исключение.
void CSEHException::Translator::trans_func(
unsigned int code,
EXCEPTION_POINTERS *pPointers)
{
switch (code)
{
case FLT_DIVIDE_BY_ZERO :
throw CMyFunkyDivideByZeroException(code, pPointers);
break;
}
// general C++ SEH exception for things we don't need to handle separately....
throw CSEHException(code, pPointers);
}
Тогда вы можете просто поймать ваш CMyFunkyDivideByZeroException()
в C ++ обычным способом.
Обратите внимание, что вам необходимо установить функцию перевода исключений в каждом потоке, для которого нужно преобразовать исключения.