спецификатор throw always. нужен ли он ?
От: Feonyf  
Дата: 03.09.09 04:28
Оценка:
есть код с ворнингом от компилятора VS2008


void AppendContext(const char* Context)
{
  MyException e(GetException());
  e.AppendContext(Context);
  throw e;
}

bool MyMain()
{
  try {
    SomethingFunction();
    return true; // в данном примере возвращаемое значение пустышка. Но в реальных приложениях такое возможно
  }
  catch(...) {
    AppendContext("MyMain context."); // компилятор выдает ворнинг throwalwaystest.cpp(63) : warning C4715: 'MyMain' : not all control paths return a value
  }
}


компилятор ведь неправ, правда ?

полный пример http://files.rsdn.ru/46977/ThrowAlwaysTest.7z

Поэтому я вижу несколько путей решения:
1. самый лучший — компилятор должен исправиться
2. похуже т.к. в п.1 наверно трудно сделать такой компилятор то нужно ввести в язык спецификатор throwalways: "void AppendContext() throwalways". На базе этого спецификатора компилятор не будет выдавать ворнингов
3. еще хуже: pragma warning(disable:4715)

Что скажете ?
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re: спецификатор throw always. нужен ли он ?
От: Сергей Мухин Россия  
Дата: 03.09.09 04:31
Оценка: 2 (1)
Здравствуйте, Feonyf, Вы писали:

F>есть код с ворнингом от компилятора VS2008



смотри
__declspec(noreturn)



например так:
__declspec(noreturn) void AppendContext(const char* Context)
{
...
  throw e;
}
---
С уважением,
Сергей Мухин
Re: спецификатор throw always. нужен ли он ?
От: jazzer Россия Skype: enerjazzer
Дата: 03.09.09 04:40
Оценка: 2 (1)
Здравствуйте, Feonyf, Вы писали:

F>Поэтому я вижу несколько путей решения:

F>1. самый лучший — компилятор должен исправиться
F>2. похуже т.к. в п.1 наверно трудно сделать такой компилятор то нужно ввести в язык спецификатор throwalways: "void AppendContext() throwalways". На базе этого спецификатора компилятор не будет выдавать ворнингов
F>3. еще хуже: pragma warning(disable:4715)

F>Что скажете ?


В GCC есть атрибут noreturn, как раз для этого:
void f() __attribute__ ((noreturn));

Для твоего компилятора — хз, то тоже должно что-то быть.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: спецификатор throw always. нужен ли он ?
От: Erop Россия  
Дата: 03.09.09 05:36
Оценка:
Здравствуйте, jazzer, Вы писали:

J>Для твоего компилятора — хз, то тоже должно что-то быть.


Есть аналог у МS, но тут есть тонкость. Таки хорошо бы компилятор проверял остальную часть функции...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: а так ругается?
От: Erop Россия  
Дата: 03.09.09 05:42
Оценка: 2 (1) +1
Здравствуйте, Feonyf, Вы писали:

F>Поэтому я вижу несколько путей решения:

<...>
F>3. еще хуже: pragma warning(disable:4715)

F>Что скажете ?

4. А такой код

MyException AppendedContext(const char* Context)
{
  MyException e(GetException());
  e.AppendContext(Context);
  return e;
}

bool MyMain()
{
  try {
    SomethingFunction();
    return true; // в данном примере возвращаемое значение пустышка. Но в реальных приложениях такое возможно
  }
  catch(...) {
    throw AppendedContext("MyMain context."); // А так компилятор выдает ворнинг? 
                //  throwalwaystest.cpp(63) : warning C4715: 'MyMain' : not all control paths return a value
  }
}
выдаёт? Лично мне такой вариант кажется читабельнее
Но если тебе так не кажется, то можно определить
#define AppendContext( arg ) throw AppendedContext( arg )
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Мне - нет
От: Константин Б. Россия  
Дата: 03.09.09 05:49
Оценка:
Здравствуйте, Feonyf, Вы писали:

F>Что скажете ?


Я бы написал бы по другому, дабы не смущать компилятор и читателей кода.
Что-то вроде:
MyException AppendContext(const char* Context)
{
  MyException e(GetException());
  e.AppendContext(Context);
  return e;
}

bool MyMain()
{
  try {
    SomethingFunction();
    return true; 
  }
  catch(...) {
    throw AppendContext("MyMain context."); 
  }
}
Re[2]: а так ругается?
От: Feonyf  
Дата: 03.09.09 05:59
Оценка:
Здравствуйте, Erop, Вы писали:
E>4. А такой код

с макросом подошло.
Конечно, с языковой конструкцией было бы лучше. Буду пользоваться макросом, и в тоже время оставлю возможность для

throw AppendedContext("MyMain context.");


Когда компиляторы научатся, от макроса избавлюсь.
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re[2]: Мне - нет
От: Feonyf  
Дата: 03.09.09 06:04
Оценка:
Здравствуйте, Константин Б., Вы писали:

КБ>Я бы написал бы по другому,


Что скажете насчет лишнего кода. Сможет ли компилятор оптимизировать код до первоначального варианта? Т.е. будет ли он генерить код для возвращаемого значения? Это конечно мелочь и я не парюсь по этому поводу, а узнать хочется ради интереса.

К сожалению в ассемблере не силен.
Моя строка построения буста:
.\bjam link=static threading=multi runtime-link=static -j %NUMBER_OF_PROCESSORS% --with-filesystem --with-thread --with-date_time address-model=64
Re[3]: Мне - нет
От: Сергей Мухин Россия  
Дата: 03.09.09 06:22
Оценка:
Здравствуйте, Feonyf, Вы писали:


КБ>>Я бы написал бы по другому,


F>Что скажете насчет лишнего кода. Сможет ли компилятор оптимизировать код до первоначального варианта? Т.е. будет ли он генерить код для возвращаемого значения? Это конечно мелочь и я не парюсь по этому поводу, а узнать хочется ради интереса.


Оптимизировать обработку исключений (по времени) обычно не нужно, т.к. это не основная ветка. Само исключение и тп займет больше времени чем вызов, например.
---
С уважением,
Сергей Мухин
Re[3]: а так ругается?
От: Rostislav_Pro  
Дата: 03.09.09 06:38
Оценка: :)
Здравствуйте, Feonyf, Вы писали:

F>Здравствуйте, Erop, Вы писали:

E>>4. А такой код

F>с макросом подошло.

F>Конечно, с языковой конструкцией было бы лучше. Буду пользоваться макросом, и в тоже время оставлю возможность для

F>
F>throw AppendedContext("MyMain context.");
F>


F>Когда компиляторы научатся, от макроса избавлюсь.


А ты заюзай паттерн "Мюнхгаузен"
http://rsdn.ru/forum/cpp/3523899.aspx
Автор: Rostislav_Pro
Дата: 02.09.09
Re: спецификатор throw always. нужен ли он ?
От: Юрий Жмеренецкий ICQ 380412032
Дата: 03.09.09 07:39
Оценка: +1
Здравствуйте, Feonyf, Вы писали:

F>есть код с ворнингом от компилятора VS2008


F>

F>void AppendContext(const char* Context)
F>{
F>  MyException e(GetException());
F>  e.AppendContext(Context);
F>  throw e;
F>}

F>bool MyMain()
F>{
F>  try {
F>    SomethingFunction();
F>    return true; // в данном примере возвращаемое значение пустышка. Но в реальных приложениях такое возможно
F>  }
F>  catch(...) {
F>    AppendContext("MyMain context."); // компилятор выдает ворнинг throwalwaystest.cpp(63) : warning C4715: 'MyMain' : not all control paths return a value
F>  }
F>}
F>


F>компилятор ведь неправ, правда ?

В общем случае он не обязан смотреть в AppendContext.

F>полный пример http://files.rsdn.ru/46977/ThrowAlwaysTest.7z


F>Поэтому я вижу несколько путей решения:

F>1. самый лучший — компилятор должен исправиться
F>2. похуже т.к. в п.1 наверно трудно сделать такой компилятор то нужно ввести в язык спецификатор throwalways: "void AppendContext() throwalways". На базе этого спецификатора компилятор не будет выдавать ворнингов
F>3. еще хуже: pragma warning(disable:4715)

F>Что скажете ?


4.
void MyMain()
{
  //...
}
Re: спецификатор throw always. нужен ли он ?
От: Николай Ивченков  
Дата: 03.09.09 10:50
Оценка:
void AppendContext(const char* Context)
{
  MyException e(GetException());
  e.AppendContext(Context);
  throw e;
}

bool MyMain()
{
  try {
    SomethingFunction();
  }
  catch(...) {
    AppendContext("MyMain context.");
  }
  return true;
}
Re[3]: Мне - нет
От: Константин Б. Россия  
Дата: 03.09.09 15:37
Оценка:
Здравствуйте, Feonyf, Вы писали:

F>Здравствуйте, Константин Б., Вы писали:


КБ>>Я бы написал бы по другому,


F>Что скажете насчет лишнего кода. Сможет ли компилятор оптимизировать код до первоначального варианта? Т.е. будет ли он генерить код для возвращаемого значения? Это конечно мелочь и я не парюсь по этому поводу, а узнать хочется ради интереса.


F>К сожалению в ассемблере не силен.


На фоне затрат на throw этот код будет совершенно не заметен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.