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

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

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

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

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

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

[identity profile] esil0x.livejournal.com 2011-08-16 09:11 am (UTC)(link)
Нету

[identity profile] rezdm.livejournal.com 2011-08-16 09:16 am (UTC)(link)
Я бы на всякий случай взглянул бы в SEH. Для очистки совести.

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

[identity profile] rezdm.livejournal.com 2011-08-16 09:50 am (UTC)(link)
http://msdn.microsoft.com/en-us/library/ms686717%28v=vs.85%29.aspx

API c-шный, потому никаких try/catch, как можно догадаться.

В чём мегабяка такого шатдауна — если тред держит какойнить критикл_секшн (может и не сам, может где в кишках сторонней билибитеки или самого вантуза). Ну и ваще шатдаунить надо корректно.

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), что вряд ли ожидает, гм, удивлённый и огорчённый программист.

[identity profile] vaddimka.livejournal.com 2011-08-16 11:12 am (UTC)(link)
за catch( ... ) без rethrow вообще надо убивать
или хотя бы гнать ссаными тряпками :)
потому что если где-то что-то сегфолтится и нейтрализуется этим кэтчем, то узнаешь ты об этом как правило слишком поздно

[identity profile] vaddimka.livejournal.com 2011-08-16 12:13 pm (UTC)(link)
а в чем проблема? все исключения STL унаследованы от std::exception
делаешь catch( std::exception& e ) и все
можешь даже после этого в сишный интерфейс какую-нибудь строковую ошибку вернуть (по e.what() выдастся const char *

[identity profile] vaddimka.livejournal.com 2011-08-16 02:47 pm (UTC)(link)
только сделай проверку, e.what() вполне может вернуть NULL (бывает что кроме типа исключения другой полезной инфы не предоставляется)

Re: сделай проверку, e.what() вполне может вернуть NULL

[identity profile] rezdm.livejournal.com 2011-08-16 03:16 pm (UTC)(link)
А что, если рантайм разный? Ну там один с гцц собрался под виндой, другой собирает прожект вижуалом, а ты из своей либы бросаешь стл-экцепшн.

Re: сделай проверку, e.what() вполне может вернуть NULL

[identity profile] rezdm.livejournal.com 2011-08-16 03:22 pm (UTC)(link)
Вполне себе, мож твою либу ваще кто-то из питона будет звать, или там, прости г-ди, дельфи.

Re: сделай проверку, e.what() вполне может вернуть NULL

[identity profile] rezdm.livejournal.com 2011-08-16 03:35 pm (UTC)(link)
Макс, говорю ж — я не знаю, что за либа, как ты её распространяешь, т.п. Вдруг забудешь.

[identity profile] esil0x.livejournal.com 2011-08-17 07:45 pm (UTC)(link)
за catch(...) и rethrow тоже надо убивать, ибо всё это надо засунуть в конструкторы/деструкторы. Но речь сейчас идёт про либу с C-интерфейсом. Идея с catch(std::exception &), кстати, подходит.

[identity profile] vaddimka.livejournal.com 2011-08-17 09:17 pm (UTC)(link)
чочо? я не понял мысль

конструкторы вообще не должны ничего кидать, это когда-то было debatable, но в итоге порешали что ну его нафиг, но это к вопросу мало относится

[identity profile] vaddimka.livejournal.com 2011-08-17 09:21 pm (UTC)(link)
очепятался
конструкторы могут, деструкторы не могут

[identity profile] al-zatv.livejournal.com 2011-08-24 06:56 pm (UTC)(link)
а я даже не понял вопроса:) но,уверен, что в конце концов всё будет хорошо:)

Re: а я даже не понял вопроса:) но,уверен, что в конце конц

[identity profile] al-zatv.livejournal.com 2011-10-16 10:12 pm (UTC)(link)
Ага,доволен. Есть где раскинуть извилинами:) Интересно. Даже на жж забил:)
Сорри что не сразу ответил, твой комментарий потерялся)