![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
Добрый день, столкнулся с такой ситуацией.
Ловил исключения. Вот так:
В процессе открыл для себя следующее: В случае если в try блоке выскакивает сообщение std::logic_error при попытке в блоке catch вывести сообщение через cout - сообщение не выводится, а выводится только если в cerr выкидываю. При отлове исключения из boost::system::system_error - все прекрасно выбрасывалось и в cout. Возник вопрос - почему? Почему, если случается исключение std::exception - не срабатывает вывод в cout, а при исключении boost - cout работает? -------------------- In silico |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
borisbn, компилятор g++ 4:4.4.5
-------------------- In silico |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Zerstroer, попробуй запустить в точности такой код:
есть подозрение, что в твоём проекте ошибка где-то в другом месте, а на cout/cerr она просто влияет -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Zerstroer |
|
||||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
borisbn, Ваши подозрения оправдались!
Вывод:
Немножко дополняю исходный пример:
Код метода setConnectParameters:
m_Port в данном случае:
Код структуры connection_parameters:
Код метода connectToPort
Исключение возникает при вызове метода connectToPort если argv[1] - был пустым. Внутри метода connectToPort - когда там вместо cerr было cout - так же вывод не работал. Это сообщение отредактировал(а) Zerstroer - 10.4.2012, 13:23 -------------------- In silico |
||||||||||||
|
|||||||||||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Может кто то банально закрыл stdout? (m_Port.open(NULL) например)
|
|||
|
||||
Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
xvr,
подскажите, как проверить это предположение? Выполнить m_Port.open(NULL) (вне блока try) и тут же что-нибудь кинуть в cout? Это сообщение отредактировал(а) Zerstroer - 10.4.2012, 13:55 -------------------- In silico |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
ага. похоже Zerstroer, распечатай argv[1] перед вызовом setConnectParameters -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
borisbn, argv[1] - пустой. Я знаю это. Пытаюсь проверить, блокирует ли m_Port.Open(NULL) stdout или нет. -------------------- In silico |
|||
|
||||
Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
Какая-то банальщина в итоге получилась.
Если в данном случае argv[1] - пустой - дальнейший вывод через cout - вообще не работает. Поясните, как это? cout << NULL; и cout << argv[1]; (где argv[1] - не существует)- не равнозначны. NULL - cout кушает, как "0" и продолжает дальше работать. А несуществующий argv[1] блокирует cout? Как это можно объяснить с точки зрения памяти? argv[1] - это не произвольный не занятый фрагмент памяти, а вообще не существующий? -------------------- In silico |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
несуществующего в Си не бывает. бывает инициализированная, доступная для read/write память и "мусор". куда указывает неинициализированный указатель argv[1] - одному разработчику gcc и создателю твоей ОС известно)) Добавлено через 25 секунд В общем, проверяй argc и будет щазтье -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
borisbn, да что его проверять-то...
я как бы должен его получать из консоли аргументы. А если аргумент из консоли не пришел, а в cout я его отправил? Почему cout блокируется? Дурацкий вопрос, конечно. Вы меня извините, интересуюсь ради самообразования. Это сообщение отредактировал(а) Zerstroer - 10.4.2012, 15:05 -------------------- In silico |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Zerstroer, это называется UB
и потом, я тебе говорю не argv проверять, а argc, т.е. количество параметров, переданных тебе из командной строки -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
borisbn, я хотел сказать, что понимаю, что в случае ввода параметров из консоли, их наличие нужно будет проверять. Это понятно. Меня интересовал сам факт того, что cout << argv[N]; - когда argv[N] - не был получен из консоли, блокирует cout. Добавлено через 2 минуты и 52 секунды Если это гарантированно Undefined behavior и иначе это объяснить нельзя, тогда вопросов больше не имею. -------------------- In silico |
|||
|
||||
borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
Zerstroer, пойми, argv тут совершенно не при чём. это равносильно тому, что написать
то, что на твоём компьютере, на твоей ОС и на твоём компиляторе "блокируется" cout, ещё не означает что при других обстоятельствах ты получишь такое же поведение своей программы. на то это и UB ![]() -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |