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

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

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

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

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

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

[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)
очепятался
конструкторы могут, деструкторы не могут