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
}
}
Поэтому я вижу несколько путей решения:
1. самый лучший — компилятор должен исправиться
2. похуже т.к. в п.1 наверно трудно сделать такой компилятор то нужно ввести в язык спецификатор throwalways: "void AppendContext() throwalways". На базе этого спецификатора компилятор не будет выдавать ворнингов
3. еще хуже: pragma warning(disable:4715)
Здравствуйте, 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, Вы писали:
J>Для твоего компилятора — хз, то тоже должно что-то быть.
Есть аналог у МS, но тут есть тонкость. Таки хорошо бы компилятор проверял остальную часть функции...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, 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
}
}
выдаёт? Лично мне такой вариант кажется читабельнее
Но если тебе так не кажется, то можно определить
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Константин Б., Вы писали:
КБ>Я бы написал бы по другому,
Что скажете насчет лишнего кода. Сможет ли компилятор оптимизировать код до первоначального варианта? Т.е. будет ли он генерить код для возвращаемого значения? Это конечно мелочь и я не парюсь по этому поводу, а узнать хочется ради интереса.
КБ>>Я бы написал бы по другому,
F>Что скажете насчет лишнего кода. Сможет ли компилятор оптимизировать код до первоначального варианта? Т.е. будет ли он генерить код для возвращаемого значения? Это конечно мелочь и я не парюсь по этому поводу, а узнать хочется ради интереса.
Оптимизировать обработку исключений (по времени) обычно не нужно, т.к. это не основная ветка. Само исключение и тп займет больше времени чем вызов, например.
Здравствуйте, Feonyf, Вы писали:
F>Здравствуйте, Erop, Вы писали: E>>4. А такой код
F>с макросом подошло. F>Конечно, с языковой конструкцией было бы лучше. Буду пользоваться макросом, и в тоже время оставлю возможность для
F>
F>throw AppendedContext("MyMain context.");
F>
F>Когда компиляторы научатся, от макроса избавлюсь.
Здравствуйте, 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>Что скажете ?
Здравствуйте, Feonyf, Вы писали:
F>Здравствуйте, Константин Б., Вы писали:
КБ>>Я бы написал бы по другому,
F>Что скажете насчет лишнего кода. Сможет ли компилятор оптимизировать код до первоначального варианта? Т.е. будет ли он генерить код для возвращаемого значения? Это конечно мелочь и я не парюсь по этому поводу, а узнать хочется ради интереса.
F>К сожалению в ассемблере не силен.
На фоне затрат на throw этот код будет совершенно не заметен.