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

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

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

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

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

Date: 2011-08-16 09:16 am (UTC)
From: [identity profile] rezdm.livejournal.com
Я бы на всякий случай взглянул бы в SEH. Для очистки совести.
From: [identity profile] rezdm.livejournal.com
http://msdn.microsoft.com/en-us/library/ms686717%28v=vs.85%29.aspx

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

В чём мегабяка такого шатдауна — если тред держит какойнить критикл_секшн (может и не сам, может где в кишках сторонней билибитеки или самого вантуза). Ну и ваще шатдаунить надо корректно.
From: [identity profile] esil0x.livejournal.com
Есть один случай, который таки может сломаться. Это когда:

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

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

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

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

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

Date: 2011-08-16 02:47 pm (UTC)
From: [identity profile] vaddimka.livejournal.com
только сделай проверку, e.what() вполне может вернуть NULL (бывает что кроме типа исключения другой полезной инфы не предоставляется)
From: [identity profile] rezdm.livejournal.com
А что, если рантайм разный? Ну там один с гцц собрался под виндой, другой собирает прожект вижуалом, а ты из своей либы бросаешь стл-экцепшн.
From: [identity profile] rezdm.livejournal.com
Вполне себе, мож твою либу ваще кто-то из питона будет звать, или там, прости г-ди, дельфи.
From: [identity profile] rezdm.livejournal.com
Макс, говорю ж — я не знаю, что за либа, как ты её распространяешь, т.п. Вдруг забудешь.

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

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

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

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

Date: 2011-08-24 06:56 pm (UTC)
From: [identity profile] al-zatv.livejournal.com
а я даже не понял вопроса:) но,уверен, что в конце концов всё будет хорошо:)
From: (Anonymous)
Не "скорее всего поймает", а "точно поймает". MS реализует исключения C++ на механизме SEH, поэтому, например, любое асинхронное исключение, вроде floating-point exception, выглядит для C++ как throw int(номер-исключения). Если кто забыл, throw можно значение любого типа - это нам не Ява.
Это приводит к очень неприятным последствиям - в частности, catch(...) у MS перехватывает даже GPF (AKA segmentation fault), что вряд ли ожидает, гм, удивлённый и огорчённый программист.
From: [identity profile] al-zatv.livejournal.com
Ага,доволен. Есть где раскинуть извилинами:) Интересно. Даже на жж забил:)
Сорри что не сразу ответил, твой комментарий потерялся)

Profile

dememax

May 2023

S M T W T F S
 123456
78910111213
14151617181920
21 2223 24252627
28293031   

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jul. 10th, 2025 02:02 pm
Powered by Dreamwidth Studios