Это да.
Вообще, совместимость модулей - это большая тема, и чем ближе подходишь, тем она больше.
Исключения C++, распределение памяти, структуры данных (кроме POD) - все может оказаться несовместимым.
Цитата:Ну как сказать... Отличаются тем, что сехи не стандартизованы. Вот разве что транслировать сехи на разных платфорах в одинаковый класс исключения... Например, что в Windows на Access Violation, что в Линухе на segfault выкидывать BadHandsException
О. Отличное название. Подождите, я записываю

Ну типа да, идея в том, чтобы сделать непереносимый платформозависимый модуль транслятора SEH, который бросает нормальные исключений С++ (а их обработка уже переносима).
Цитата:Прилетать в другой модуль чужие исключения могут только в случае, когда CRT у них совместимы и генерируемый код таков, что CRT правильно может сделать раскрутку стека. С VC6 и IC проблем нет.
Тут меня печалит несколько другой момент.
Предположим, мы в двух
совместимых модулях независимо используем _set_se_translator
При этом в одном модуле пишем
static void se_translator(unsigned int code,_EXCEPTION_POINTERS *)
{
if (code == EXCEPTION_FLT_DIVIDE_BY_ZERO)
throw CDivideByZero();
}
дальше где-то
try
{
// something useful
}
catch(CDivideByZero& e)
{
// handler
}
В другом модуле - все то же самое, но не CDivideByZero, а какой-нибудь CFckngDiv.
В итоге, модуль, который загружается вторым, переопределяет se_translator на свой, и в первый модуль начинают прилетать не CDivideByZero, а CFckngDiv, что соответствующим образом влияет на общий анамнез.
Есть вероятность, что здесь есть какие-то тонкости, но на первый взгляд этот механизм, либо надо использовать единолично, когда больше никто не использует, либо использовать один se_translator на все модули, либо не использовать вообще.
Цитата:Ведь после возникновения сеха, как правило, сделать уже почти ничего нельзя. Вернее, если продолжать работать, как ни в чем не бывало, то, скорее всего, будет еще хуже. Поэтому и смешивание исключений и сехов - ИМХО, уж очень нехорошо смотрится. Исключение - просто способ передачи управления, а win32-исключение - что-то почти всегда фатальное.
Я вообще-то ничего такого на замышлял.

Тут, наверное, некоторые подумали, не принес ли я последние клетки головного мозга в жертву дешевому пиву и не собрался ли продолжать работу после отлова AV и того подобного.
Не, все путем, можно не волноваться

Мне надо обрабатывать ошибки арифметики с плавающей точкой + целочисленные деления на ноль.
Выхода тут 3.
1. Ручная проверка допустимости параметров (0, <0, isnan, finite и т.п.)
2. Использование __try/__except
3. Использование _set_se_translator + трансляция SEH в cpp + try/catch для транслированных исключений cpp.
Везде, как водится, свои плюсы и минусы.
Короче, стою, и вспоминаю: налево пойдешь - xxx направо пойдешь - xxx прямо пойдешь - xxx, а слишком долго думать будешь - прямо здесь - xxx