throw what?
От: Кодт Россия  
Дата: 06.08.04 13:19
Оценка:
Сейчас натолкнулся на вот такой странный код:
        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.
Перекуём баги на фичи!
Re: throw what?
От: Twirl Швеция  
Дата: 06.08.04 13:32
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Сейчас натолкнулся на вот такой странный код:

К>
К>        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.


хм. вообще такая конструкция используется для переброски исключения на уровень выше, но она используется в catch. что она означает в try — хз
Re: throw what?
От: _AK_ Россия  
Дата: 06.08.04 13:34
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Сейчас натолкнулся на вот такой странный код:

К>
К>        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 what?
От: Alny Украина  
Дата: 06.08.04 13:34
Оценка:
К>
К>            if (it == m_mapAiInfo.end())
К>                throw; // <--- что это?
К>        }
К>        catch(HRESULT)
К>        {
К>            ATLASSERT(!"CEan128EditDlg::OnSelchangeComboAllcodes failed");
К>        }
К>

К>Компилятор VC6.
Читаем MSDN A throw-expression with no operand re-throws the exception currently being handled. Such an expression should appear only in a catch handler or in a function called from within a catch handler
Может быть это как раз второй случай?
Re[2]: throw what?
От: davenger  
Дата: 06.08.04 13:41
Оценка:
Здравствуйте, Alny, Вы писали:

К>>Компилятор VC6.

A>Читаем MSDN A throw-expression with no operand re-throws the exception currently being handled. Such an expression should appear only in a catch handler or in a function called from within a catch handler
A>Может быть это как раз второй случай?

Вот такое Вц6 компилит без вопросов
// thowtest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


int main(int argc, char* argv[])
{
    try
    {
        throw;
    }
    catch (int)
    {
    }
    return 0;
}
Re: throw what?
От: Bell Россия  
Дата: 06.08.04 13:43
Оценка:
Здравствуйте, Кодт, Вы писали:

Мой пример (VC6)
int main()
{
   try
   {
      throw;
   }
   catch(int)
   {
      cerr << "int\n";
   }
   catch(...)
   {
      cerr << "...\n";
   }
   return 0;
}


завершился весьма плачевно:
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Остается только обратится к себе с вопросом: кто виноват, и что делать
Любите книгу — источник знаний (с) М.Горький
Re[2]: throw what?
От: _nn_  
Дата: 06.08.04 13:46
Оценка:
Здравствуйте, Bell, Вы писали:

А вот VC 8.0 выдает следущее :

Unhandled exception at 0x77e73887 (kernel32.dll) in test.exe: Microsoft C++ exception: [rethrow] at memory location 0x0000000

http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: throw what?
От: Кодт Россия  
Дата: 06.08.04 13:50
Оценка:
Здравствуйте, Alny, Вы писали:

A>Читаем MSDN A throw-expression with no operand re-throws the exception currently being handled. Such an expression should appear only in a catch handler or in a function called from within a catch handler

A>Может быть это как раз второй случай?

Это самый обычный ляп.

То есть понятно, что компилятор расценил его как re-throw.

Натурный эксперимент показал, что re-throw без throw/catch приводит к abort().
А что говорит Стандарт по этому поводу?
Перекуём баги на фичи!
Re[3]: throw what?
От: Twirl Швеция  
Дата: 06.08.04 13:56
Оценка: 45 (4) +1
Здравствуйте, Кодт, Вы писали:

К>Натурный эксперимент показал, что 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)
Re[4]: throw what?
От: Twirl Швеция  
Дата: 06.08.04 13:59
Оценка:
Здравствуйте, 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)


извниняюсь это было 15.1.8
Re[3]: throw what?
От: maq Россия http://www.maqdev.com
Дата: 06.08.04 14:00
Оценка:
К>А что говорит Стандарт по этому поводу?

15.5.1 — будет вызван terminate():

- when a throw-expression with no operand attempts to rethrow an exception and no exception is being handled (15.1), or

... << RSDN@Home 1.1.4 beta 2 >>
Re[2]: throw what?
От: Bell Россия  
Дата: 06.08.04 14:04
Оценка: 1 (1)
Здравствуйте, Bell, Вы писали:

Позоже, вот ответ:

15.1/8
If no exception is presently being handled, executing a throwexpression
with no operand calls terminate() (15.5.1).


По крайне мере пример
struct test
{
   ~test() { throw 1; }
};

int main()
{
   try
   {
      test t;
      throw 1;
   }
   catch(...)
   {
      cerr << "...\n";
   }
   return 0;
}


дает такое же поведение.
Любите книгу — источник знаний (с) М.Горький
Re: throw what?
От: ssm Россия  
Дата: 06.08.04 14:23
Оценка:
Здравствуйте, Кодт, Вы писали:


и чего же ты молчал, когда обсуждали обработку HRESULT

К>            ComError ce = spAI->getFormat(&aiFormat); // кидает HRESULT если он FAILED()
К>            m_apTopPanel->SetTitle(T2CW(makePrompt(aiFormat)));
К>            ce = spAI->getAI(&WsTaskTemp);


способ вроде самый прикольный
Re[2]: throw what?
От: Кодт Россия  
Дата: 06.08.04 14:54
Оценка:
Здравствуйте, 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-блоки.
Перекуём баги на фичи!
Re[2]: throw what?
От: Apapa Россия  
Дата: 06.08.04 15:33
Оценка:
Здравствуйте, _AK_, Вы писали:

_AK>В случае MSVC получится исключение, которое невозможно поймать (rethrow), учень удобно как затычка для функций (кусков функций) функционал которых ещё не написан, но должен быть написан. Может быть автор кода приведённого выше мыслит также.


throw без параметров компилируется вне блока catch, т.к. практически любой кусок кода потенциально в run-time может выполняться после генерации исключения (вызов функций, например). Во время выполнения — это другое дело. Тут уж от программы требуется передать исключение дальше, а где оно? Нету.

И все же это весьма странный способ "затыкать" недоделанные места. Почему? Да потому что кроме вызова terminate() и abort() ничего выполняться не будет. Так не проще ли просто написать abort(). Чем это лучше? Проще искать места недоделок. В обычном "доделанном" коде abort() встречается крайне редко, в отличии от throw; ИМХО


Здесь могла бы быть Ваша реклама!
Re[3]: throw what?
От: ssm Россия  
Дата: 09.08.04 07:07
Оценка:
Здравствуйте, Кодт, Вы писали:


К>А где обсуждали?

здесь
Автор: SiGMan / iO UpG
Дата: 04.08.04


К>На самом деле, не самый прикольный способ. Более того, местами это очень гнусный способ.

К>Я родил похожий класс — HResultTest — у которого дофига параметров, сообщающих — что фильтровать и как реагировать.
К>(кидать исключение, assert или игнорировать).

К>Там вообще всё красиво:

К>
К>TEST_HR(hr) = something();
К>

К>макрос TEST_HR, помимо прочего, фиксирует __FILE__/__LINE__ что позволяет отлаживать длинные try-блоки.

может поделишься с общественностью ?
Re: throw what?
От: _Winnie Россия C++.freerun
Дата: 09.08.04 20:40
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Сейчас натолкнулся на вот такой странный код:

К>
К>                throw; // <--- что это?
К>

К>Компилятор VC6.

Имхо, это просто опечатка. Должно быть
К<
К<                throw E_ИЗВИНИТЕ_НЕ_ПОЛУЧИЛОСЬ; // <--- что это?
К<


где E_ИЗВИНИТЕ_НЕ_ПОЛУЧИЛОСЬ — это HRESULT

Может быть и и такое, но я сомневаюсь


#include <iostream>

void f()
{
  throw; //кто мог знать, что это внутри catch? =^.^=
}

void g()
{
  try
  {
    throw 1;
  }
  catch (...)
  {
    f();
    throw;
  }
}


int main()
{
  try
  {
    g();
  }
  catch (...)
  {    
    std::cout <<"hello, world\n";
  }
}
Правильно работающая программа — просто частный случай Undefined Behavior
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.