dememax ([personal profile] dememax) wrote2011-08-16 12:38 pm

Вопрос: Как дела с catch(...) в MS?

Думаю, многие из вас в курсе, что в NPTL механизм pthread_cancel() реализован с помощью исключений. Таким образом, следует избегать нейтрализации catch(...).

Знающие люди, а скажите, есть ли в мелко-мягкой среде какие-то подводные камни, из-за которых тоже следует избегать такой нейтрализации?

Заранее благодарен! :-)

Update: Обратные ссылки: alextutubalin: Об исключениях (C++)

Re: Я бы на всякий случай взглянул бы в SEH. Для очистки со

[identity profile] esil0x.livejournal.com 2011-08-16 10:20 am (UTC)(link)
Есть один случай, который таки может сломаться. Это когда:

1) В твою библиотеку передаётся callback
2) Библиотека вызывает callback
3) callback кидает исключение

Тут надо определиться, может ли callback кидать исключение. Вроде как у либы интерфейс plain C, так что никаких С++ исключений быть не должно. Но могут попробовать кинуть исключение SEH и скорее всего catch(...) его поймает.

Короче в любом случае надо определяться, могут ли callback'и кидать исключения, т. к. в этом случае в дизайне либы это должно учитываться.

Re: Я бы на всякий случай взглянул бы в SEH. Для очистки со

[identity profile] rezdm.livejournal.com 2011-08-17 10:10 pm (UTC)(link)
Меня терают смутные сомнения, что кетч-три-точки словит СЕХ. Также, как и обратно.

Re: Я бы на всякий случай взглянул бы в SEH. Для очистки со

(Anonymous) 2011-08-28 04:31 pm (UTC)(link)
Не "скорее всего поймает", а "точно поймает". MS реализует исключения C++ на механизме SEH, поэтому, например, любое асинхронное исключение, вроде floating-point exception, выглядит для C++ как throw int(номер-исключения). Если кто забыл, throw можно значение любого типа - это нам не Ява.
Это приводит к очень неприятным последствиям - в частности, catch(...) у MS перехватывает даже GPF (AKA segmentation fault), что вряд ли ожидает, гм, удивлённый и огорчённый программист.