Вопрос: Как дела с catch(...) в MS?
Aug. 16th, 2011 12:38 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Думаю, многие из вас в курсе, что в NPTL механизм pthread_cancel() реализован с помощью исключений. Таким образом, следует избегать нейтрализации catch(...).
Знающие люди, а скажите, есть ли в мелко-мягкой среде какие-то подводные камни, из-за которых тоже следует избегать такой нейтрализации?
Заранее благодарен! :-)
Update: Обратные ссылки: alextutubalin: Об исключениях (C++)
Знающие люди, а скажите, есть ли в мелко-мягкой среде какие-то подводные камни, из-за которых тоже следует избегать такой нейтрализации?
Заранее благодарен! :-)
Update: Обратные ссылки: alextutubalin: Об исключениях (C++)
no subject
Date: 2011-08-16 09:11 am (UTC)no subject
Date: 2011-08-16 09:16 am (UTC)Re: Нету
Date: 2011-08-16 09:38 am (UTC)Re: Я бы на всякий случай взглянул бы в SEH. Для очистки со
Date: 2011-08-16 09:42 am (UTC)Но если таки очистишь совесть - дай знать! ;-)
Re: Я бы на всякий случай взглянул бы в SEH. Для очистки со
Date: 2011-08-16 09:50 am (UTC)API c-шный, потому никаких try/catch, как можно догадаться.
В чём мегабяка такого шатдауна если тред держит какойнить критикл_секшн (может и не сам, может где в кишках сторонней билибитеки или самого вантуза). Ну и ваще шатдаунить надо корректно.
Re: Я бы на всякий случай взглянул бы в SEH. Для очистки со
Date: 2011-08-16 09:58 am (UTC)Мне нужно обеспечить недопустимость вырывания наружу исключений за plain-C интерфейс. Из поста следует, что не все исключения я должен гасить, но это - в среде Линукса.
Re: Я бы на всякий случай взглянул бы в SEH. Для очистки со
Date: 2011-08-16 10:20 am (UTC)1) В твою библиотеку передаётся callback
2) Библиотека вызывает callback
3) callback кидает исключение
Тут надо определиться, может ли callback кидать исключение. Вроде как у либы интерфейс plain C, так что никаких С++ исключений быть не должно. Но могут попробовать кинуть исключение SEH и скорее всего catch(...) его поймает.
Короче в любом случае надо определяться, могут ли callback'и кидать исключения, т. к. в этом случае в дизайне либы это должно учитываться.
Re: Я бы на всякий случай взглянул бы в SEH. Для очистки со
Date: 2011-08-16 10:28 am (UTC)Я и сам понял это.
Обязательно добавлю комментарий в заголовочный файл plain-C интерфейса, что же ожидается от передаваемого обратного вызова и что лучше будет использовать лежащий в основе C++ интерфейс библиотеки.
no subject
Date: 2011-08-16 11:12 am (UTC)или хотя бы гнать ссаными тряпками :)
потому что если где-то что-то сегфолтится и нейтрализуется этим кэтчем, то узнаешь ты об этом как правило слишком поздно
Re: за catch( ... ) без rethrow вообще надо убивать
Date: 2011-08-16 11:22 am (UTC)Что сделаешь, если у тебя реализация на Си++, а тебя просят спрятать это за обычным Си, требуя, чтобы никаких исключений не вырывалось наружу?
Да, есть некоторый набор исключений самой библиотеки.
Но она использует, например, STL.
no subject
Date: 2011-08-16 12:13 pm (UTC)делаешь catch( std::exception& e ) и все
можешь даже после этого в сишный интерфейс какую-нибудь строковую ошибку вернуть (по e.what() выдастся const char *
Re: в чем проблема? все исключения STL унаследованы от std::e
Date: 2011-08-16 02:44 pm (UTC)Спасибо!
no subject
Date: 2011-08-16 02:47 pm (UTC)Re: сделай проверку, e.what() вполне может вернуть NULL
Date: 2011-08-16 02:59 pm (UTC)А тип исключения, действительно, может многое сказать, ведь базовый класс STL исключений содержит виртуальную таблицу, а значит, можно получить run-time type infromation - люблю этим пользоваться в этих случаях.
Re: сделай проверку, e.what() вполне может вернуть NULL
Date: 2011-08-16 03:16 pm (UTC)Re: сделай проверку, e.what() вполне может вернуть NULL
Date: 2011-08-16 03:21 pm (UTC)"А вы так - не делайте!"
Re: сделай проверку, e.what() вполне может вернуть NULL
Date: 2011-08-16 03:22 pm (UTC)Re: сделай проверку, e.what() вполне может вернуть NULL
Date: 2011-08-16 03:34 pm (UTC)У меня вызовы - кошерные? Кошерные!
Библиотека с остальным кодом в исполняемый модуль собралась? Собралась!
Что ты ещё от меня хочешь?
А прострелить себе ногу - я тебе могу и без исключений и в одной среде способов предложить; те же встроенные конструкторы и невстроенные деструкторы: создавай одни в одной библиотеке в отладке, а разрушай - в другой в релизе, ну или что-то в этом роде.
Re: сделай проверку, e.what() вполне может вернуть NULL
Date: 2011-08-16 03:35 pm (UTC)Re: сделай проверку, e.what() вполне может вернуть NULL
Date: 2011-08-16 03:37 pm (UTC)Да, мне и без этих мыслей - хватает, чем задуматься.
Но ты, эта, держи меня в тонусе, продолжай писать... ;-)
no subject
Date: 2011-08-17 07:45 pm (UTC)Re: Идея с catch(std::exception &), кстати, подходит.
Date: 2011-08-17 07:48 pm (UTC)Всем спасибо!
Я должен был бы сам догадаться и не тревожить общественность по пустякам...
no subject
Date: 2011-08-17 09:17 pm (UTC)конструкторы вообще не должны ничего кидать, это когда-то было debatable, но в итоге порешали что ну его нафиг, но это к вопросу мало относится
Re: конструкторы вообще не должны ничего кидать, это ког
Date: 2011-08-17 09:19 pm (UTC)Деструкторы - да, согласен, не должны.
no subject
Date: 2011-08-17 09:21 pm (UTC)конструкторы могут, деструкторы не могут
Re: Я бы на всякий случай взглянул бы в SEH. Для очистки со
Date: 2011-08-17 10:10 pm (UTC)no subject
Date: 2011-08-24 06:56 pm (UTC)Re: а я даже не понял вопроса:) но,уверен, что в конце конц
Date: 2011-08-24 07:21 pm (UTC)Как сам-то?
Доволен работой в результате?
Re: Я бы на всякий случай взглянул бы в SEH. Для очистки со
Date: 2011-08-28 04:31 pm (UTC)Это приводит к очень неприятным последствиям - в частности, catch(...) у MS перехватывает даже GPF (AKA segmentation fault), что вряд ли ожидает, гм, удивлённый и огорчённый программист.
Re: а я даже не понял вопроса:) но,уверен, что в конце конц
Date: 2011-10-16 10:12 pm (UTC)Сорри что не сразу ответил, твой комментарий потерялся)
Re: а я даже не понял вопроса:) но,уверен, что в конце конц
Date: 2011-10-17 06:50 am (UTC)И не стоит волноваться, я вполне понимаю...
А на ЖЖ - я и сам забиваю...
Хотя, конечно, на активность - отвечаю активностью!
(в смысле, если уж комментарии есть - как минимум просматриваю)