Re[3]: подход к try-catch
От: Conr Россия  
Дата: 17.05.06 14:10
Оценка:
Здравствуйте, AndrewJD, Вы писали:

AJD>Небольшой вопросик.

AJD>Сколько раз, согласно стандарту, мы можем перевыбрасывать одно и то же исключение? Т.е. первый раз мы перевыбросили исключение в фильтре. Насколько законно его еще раз выбросить?
Сколько душе угодно
Re[4]: подход к try-catch
От: AndrewJD США  
Дата: 17.05.06 14:35
Оценка:
Здравствуйте, Conr, Вы писали:

AJD>>Сколько раз, согласно стандарту, мы можем перевыбрасывать одно и то же исключение? Т.е. первый раз мы перевыбросили исключение в фильтре. Насколько законно его еще раз выбросить?

C>Сколько душе угодно

Верю . Но хотелось бы цитату из стандарта.
"For every complex problem, there is a solution that is simple, neat,
and wrong."
Re[5]: подход к try-catch
От: Conr Россия  
Дата: 17.05.06 14:50
Оценка: 4 (1)
Здравствуйте, AndrewJD, Вы писали:

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


AJD>>>Сколько раз, согласно стандарту, мы можем перевыбрасывать одно и то же исключение? Т.е. первый раз мы перевыбросили исключение в фильтре. Насколько законно его еще раз выбросить?

C>>Сколько душе угодно

AJD>Верю . Но хотелось бы цитату из стандарта.


15.1
6) A throw-expression with no operand rethrows the exception being handled. The exception is reactivated
with the existing temporary; no new temporary exception object is created. The exception is no longer considered
to be caught; therefore, the value of uncaught_exception() will again be true.

Re[5]: подход к try-catch
От: MuTPu4  
Дата: 17.05.06 15:05
Оценка:
Здравствуйте, AndrewJD, Вы писали:

AJD>Сколько раз, согласно стандарту, мы можем перевыбрасывать одно и то же исключение? Т.е. первый раз мы перевыбросили исключение в фильтре. Насколько законно его еще раз выбросить?

Стандарт не налагает каких-либо ограничений на этот счет. Исключение может быть переброшено тогда и только тогда, когда оно обрабатывается, если это условие выполнено, то выброс исключения корректен не зависимо от "вложенности".

AJD>Верю . Но хотелось бы цитату из стандарта.

(15.1/6):

A throw-expression with no operand rethrows the exception being handled.
...
The exception is no longer considered to be caught;
...


(15.1/7):

...
An exception is considered caught when initialization is complete for the formal parameter of the corresponding catch clause
...
An exception is considered finished when the corresponding catch clause exits
...


(15.1/8):

If no exception is presently being handled, executing a throw-expression with no operand calls terminate()


(15.3/8)

An exception is considered handled upon entry to a handler.

Re[2]: маленький недостаток
От: Аноним  
Дата: 18.05.06 13:17
Оценка:
При использовании такого фильтра, как я понимаю есть небольшой шанс получить:

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
Press any key to continue


Например, если написать вот так:

#include <iostream>

//---------------------------------------
void ExceptionFilter () {
    try {
        throw;
    }
    catch (...) {
        std::cout << "in ExceptionFilter ..." << std::endl;
    }
}

//---------------------------------------
bool c () {
    ExceptionFilter (); // формально никто нам не запрещает написать (случайно при copy/paste) так где-то глубоко в коде.
    return true;
}

//---------------------------------------
bool b () {
    return c();
}

//---------------------------------------
bool a () {
    return b();
}

//---------------------------------------
int main () {
    try {

        a (); 
        
    }
    catch (...) {
        ExceptionFilter();
        std::cout << "in main ... " << std::endl;
    }
    return 0;
}
Re[2]: подход к try-catch
От: Аноним  
Дата: 19.05.06 12:05
Оценка:
Здравствуйте, 0xDEADBEEF, Вы писали:

DEA>Hello, Аноним !

DEA>You wrote on Wed, 05 Oct 2005 10:44:31 GMT:

А>> Каким образом можно избавиться от повторяющихся catch

А>> блоков, желательно без использования макросов?
DEA>Используем "фильтр исключений" (вот так):
DEA>
DEA>void TheFunction()
DEA>{
DEA>    try {
DEA>        //твоя функция
DEA>    } catch(...) {
DEA>        ExceptionFilter();
DEA>    }
DEA>}

DEA>void ExceptionFilter()
DEA>{
DEA>    try {
DEA>        throw;
DEA>    } catch(Exception1 const& e) {
DEA>        //делаем одно
DEA>    } catch(Exception2 const& e) {
DEA>        //делаем второе
DEA>    } catch(Exception3 const& e) {
DEA>        //делаем третье
DEA>    } catch(Exception4 const& e) {
DEA>        //делаем четвертое
DEA>    } catch(Exception5 const& e) {
DEA>        //делаем пятое
DEA>    } catch(...) {
DEA>        //делаем еще что-то
DEA>    }
DEA>}
DEA>


DEA>ЗЫ. Естественно, фильтров и их вариаций может быть много...


Интересно что этот вопрос и это решение с фильтром возникает с устойчевой периодичностью в месяцев ~ 6. И каждай раз восторги. Интрересно можно это время (6 месяцем) считать периодом практически полного обновления читателей форума.
Re[3]: маленький недостаток
От: MuTPu4  
Дата: 19.05.06 22:35
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>При использовании такого фильтра, как я понимаю есть небольшой шанс получить:


А>This application has requested the Runtime to terminate it in an unusual way.

А>Please contact the application's support team for more information.
А>Press any key to continue


А>Например, если написать вот так:


Я бы упростил пример:

void ExceptionFilter () {
    try {
        throw;
    }
    catch (...) {
        std::cout << "in ExceptionFilter ..." << std::endl;
    }
}

int main( void )
{
  ExceptionFilter(); // формально никто нам не запрещает написать (случайно при copy/paste) так где-то глубоко в коде.
}


Re[2]: подход к try-catch
От: Maxim S. Shatskih Россия  
Дата: 27.07.07 14:22
Оценка:
DEA>Используем "фильтр исключений" (вот так):

О! Кода уже не меньше, чем с обычной проверкой кода ошибки, вдобавок он разрозненный.
Занимайтесь LoveCraftом, а не WarCraftом!
Re[3]: подход к try-catch
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 30.07.07 06:50
Оценка:
Здравствуйте, Maxim S. Shatskih, Вы писали:

DEA>>Используем "фильтр исключений" (вот так):


MSS>О! Кода уже не меньше, чем с обычной проверкой кода ошибки, вдобавок он разрозненный.


Максим, Вы меня разачаровываете

Приведенный подход — отличное решение для интеграции независимых разработок, компилируемых вместе, и для централизованной обработки исключений (та самая разрозненность, которая вам не нравится, есть ни что иное как отделение основного кода от кода обработки ошибок).

А коды ошибок, особенно в чистом виде, — это даже не вчерашний день.

Сейчас даже использование исключений для транспортировки "тупого текста с описанием" — это не кошерно. Возникают грабли при локализации и попытках добавить сведения о слоях, через которые исключение будет выскакивать наружу.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.