Здравствуйте, Кодт, Вы писали:
К>Сейчас натолкнулся на вот такой странный код: К>
К> try
К> {
К> MAP_AI_INFO::iterator it = m_mapAiInfo.find(T2CW(strInfo));
К> if (it == m_mapAiInfo.end())
К> throw;// <--- что это?
К> spAI = it->second;
К> Ean128_AI_Format aiFormat;
К> ComError ce = spAI->getFormat(&aiFormat); // кидает HRESULT если он FAILED()
К> m_apTopPanel->SetTitle(T2CW(makePrompt(aiFormat)));
К> ce = spAI->getAI(&WsTaskTemp);
К> }
К> catch(HRESULT)
К> {
К> ATLASSERT(!"CEan128EditDlg::OnSelchangeComboAllcodes failed");
К> }
К>
К>Компилятор VC6.
В случае MSVC получится исключение, которое невозможно поймать (rethrow), учень удобно как затычка для функций (кусков функций) функционал которых ещё не написан, но должен быть написан. Может быть автор кода приведённого выше мыслит также.
Здравствуйте, Кодт, Вы писали:
К>Натурный эксперимент показал, что re-throw без throw/catch приводит к abort(). К>А что говорит Стандарт по этому поводу?
15.8 If no exeption is presently being handled, executing a throw-expression with no operand calls termminate() (15.5.1)
Здравствуйте, Twirl, Вы писали:
T>Здравствуйте, Кодт, Вы писали:
К>>Натурный эксперимент показал, что re-throw без throw/catch приводит к abort(). К>>А что говорит Стандарт по этому поводу?
T>15.8 If no exeption is presently being handled, executing a throw-expression with no operand calls termminate() (15.5.1)
и чего же ты молчал, когда обсуждали обработку HRESULT
К> ComError ce = spAI->getFormat(&aiFormat); // кидает HRESULT если он FAILED()
К> m_apTopPanel->SetTitle(T2CW(makePrompt(aiFormat)));
К> ce = spAI->getAI(&WsTaskTemp);
Здравствуйте, ssm, Вы писали:
ssm> и чего же ты молчал, когда обсуждали обработку HRESULT
ssm>
К>> ComError ce = spAI->getFormat(&aiFormat); // кидает HRESULT если он FAILED()
К>> m_apTopPanel->SetTitle(T2CW(makePrompt(aiFormat)));
К>> ce = spAI->getAI(&WsTaskTemp);
ssm>
ssm>способ вроде самый прикольный
А где обсуждали?
На самом деле, не самый прикольный способ. Более того, местами это очень гнусный способ.
Я родил похожий класс — HResultTest — у которого дофига параметров, сообщающих — что фильтровать и как реагировать.
(кидать исключение, assert или игнорировать).
Там вообще всё красиво:
TEST_HR(hr) = something();
макрос TEST_HR, помимо прочего, фиксирует __FILE__/__LINE__ что позволяет отлаживать длинные try-блоки.
Здравствуйте, _AK_, Вы писали:
_AK>В случае MSVC получится исключение, которое невозможно поймать (rethrow), учень удобно как затычка для функций (кусков функций) функционал которых ещё не написан, но должен быть написан. Может быть автор кода приведённого выше мыслит также.
throw без параметров компилируется вне блока catch, т.к. практически любой кусок кода потенциально в run-time может выполняться после генерации исключения (вызов функций, например). Во время выполнения — это другое дело. Тут уж от программы требуется передать исключение дальше, а где оно? Нету.
И все же это весьма странный способ "затыкать" недоделанные места. Почему? Да потому что кроме вызова terminate() и abort() ничего выполняться не будет. Так не проще ли просто написать abort(). Чем это лучше? Проще искать места недоделок. В обычном "доделанном" коде abort() встречается крайне редко, в отличии от throw; ИМХО
К>На самом деле, не самый прикольный способ. Более того, местами это очень гнусный способ. К>Я родил похожий класс — HResultTest — у которого дофига параметров, сообщающих — что фильтровать и как реагировать. К>(кидать исключение, assert или игнорировать).
К>Там вообще всё красиво: К>
К>TEST_HR(hr) = something();
К>
К>макрос TEST_HR, помимо прочего, фиксирует __FILE__/__LINE__ что позволяет отлаживать длинные try-блоки.