Варнинг при декларировании функции кидающее исключение
От: Аноним  
Дата: 06.05.06 14:41
Оценка:
Всем привет!

Есть класс. Хочу один из методов который может кинуть исключение объявить красиво

пишу в хидере вот так
HRESULT Initialize(VARIANT Session) throw(class _simple_exception);


на что студия(2003-я) говорит

warning C4290: C++ exception specification ignored except to indicate a function is not __declspec(nothrow)


мсдн говорит вот это

A function is declared using exception specification, which Visual C++ accepts but does not implement. Code with exception specifications that are ignored during compilation may need to be recompiled and linked to be reused in future versions supporting exception specifications.


что значит следующее? — which Visual C++ accepts but does not implement
это значит что в 2003-ей это не реализованно? правильно я понял?

юзать прагму нихачу
Re: Варнинг при декларировании функции кидающее исключение
От: BitField Украина http://lazy-bitfield.blogspot.com
Дата: 06.05.06 15:16
Оценка:
Здравствуйте, Аноним, Вы писали:

1) Спецификация исключений не поддерживается в 7й студии
2) По рекомендациям "лучших собаководов", спецификация исключений -- вещь неудобная. Поэтому ее либо вообще не используют, либо используют только throw () -- для ф-ций, не броосающих исключения..
Re: Варнинг при декларировании функции кидающее исключение
От: vvotan Россия  
Дата: 06.05.06 15:23
Оценка:
Здравствуйте, <Аноним>, Вы писали:


А>что значит следующее? — which Visual C++ accepts but does not implement

А>это значит что в 2003-ей это не реализованно? правильно я понял?
Это значит, что компилятор считает такую конструкцию синтаксически верной, но соответствующего ей поведения не реализует.
--
Sergey Chadov

... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Варнинг при декларировании функции кидающее исключение
От: Аноним  
Дата: 07.05.06 08:39
Оценка:
ага... понял. не реализованно.
а насчёт не юзать не понял. а в чём подводные камни-то?
Re[2]: Варнинг при декларировании функции кидающее исключени
От: Аноним  
Дата: 07.05.06 08:52
Оценка:
А>а насчёт не юзать не понял. а в чём подводные камни-то?
Или имелось ввиду что всякий метод уидает ексепшины, а задекларированная с "throw()" не кидает. так?
Если так то тогда вопрос. Если в комплексе куча типов ексепшинов. то что после вызова метода писать код для всех типов? Если их 2-3-4 ещё ладно. А если больше?
Re[3]: Варнинг при декларировании функции кидающее исключени
От: saddva  
Дата: 07.05.06 09:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>а насчёт не юзать не понял. а в чём подводные камни-то?

А>Или имелось ввиду что всякий метод уидает ексепшины, а задекларированная с "throw()" не кидает. так?

По поводу спецификации исключений см. здесь.
Просто на самом деле получается, что метод в результате оказывается
или throw(...) — кидает исключение (не указывается, какое именно)
или throw() — не кидает исключений.
Вы можете указать throw(exception_type), просто компилятор это воспримет как throw(...). И об этом предупредит вас warning'ом.
Это я к тому, что никто не запрещает вам указывать, что ваш метод кидает только конкретные 3, допустим, исключения. Но эта информация никем не будет проверяться и будет просто служить указанием использующему ваш код — что ловить.

А>Если так то тогда вопрос. Если в комплексе куча типов ексепшинов. то что после вызова метода писать код для всех типов? Если их 2-3-4 ещё ладно. А если больше?


Какую политику по отношению к исключениям избрать — здесь ответ зависит от конкретного случая.
Re[3]: Варнинг при декларировании функции кидающее исключени
От: pavel_turbin  
Дата: 07.05.06 10:36
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>а насчёт не юзать не понял. а в чём подводные камни-то?

А>Или имелось ввиду что всякий метод уидает ексепшины, а задекларированная с "throw()" не кидает. так?
А>Если так то тогда вопрос. Если в комплексе куча типов ексепшинов. то что после вызова метода писать код для всех типов? Если их 2-3-4 ещё ладно. А если больше?


типа так

try
{
 call_something();
}
catch( ex1 e)
{

}
catch( ex2 e)
{

}
catch( ... )
{

}
Re[3]: Варнинг при декларировании функции кидающее исключени
От: BitField Украина http://lazy-bitfield.blogspot.com
Дата: 07.05.06 10:56
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>а насчёт не юзать не понял. а в чём подводные камни-то?


Тема подводных камней при спецификации исключений обсуждалась тут
Автор: bolshik
Дата: 13.03.06
.
Re[4]: Варнинг при декларировании функции кидающее исключени
От: BitField Украина http://lazy-bitfield.blogspot.com
Дата: 07.05.06 10:59
Оценка:
Здравствуйте, BitField, Вы писали:

BF>Здравствуйте, Аноним, Вы писали:


А>>>а насчёт не юзать не понял. а в чём подводные камни-то?


BF>Тема подводных камней при спецификации исключений обсуждалась тут
Автор: bolshik
Дата: 13.03.06
.


Очень понравился ответ megawatt-a

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

Re[5]: Варнинг при декларировании функции кидающее исключени
От: Аноним  
Дата: 07.05.06 12:23
Оценка:
BF>Очень понравился ответ megawatt-a
BF>

BF>— если спецификация есть и она пустая, то такой метод безопасен от исключений
BF>— если спецификация отсутствует, это означает что метод может кинуть исключение
BF>( какое именно и при каких условиях лучше что бы об этом было написано в документации/коментарии )
BF>— если спецификация есть и она не пуста, это означает только одно, код писал индус.


почитал... согласен и не согласен, всё равно хочу заюзать, чувствую себя индусом

на данный момент вот что я имею

            hr = UpdateProcessStatus(...
            if ( errName!=OkResult )
            {
                _bstr_t tmpErr = errName;
                hr = FinishProcess(processID, 2);
                if ( errName!=OkResult )
                {
                    ErrorCheck(ErrorName);
                    return S_OK;
                }
                errName = tmpErr;
                ErrorCheck(ErrorName);
                return S_OK;
            }

            hr = UpdateProcessStatus(...
            if ( errName!=OkResult )
            {
                _bstr_t tmpErr = errName;
                hr = FinishProcess(processID, 2);
                if ( errName!=OkResult )
                {
                    ErrorCheck(ErrorName);
                    return S_OK;
                }
                errName = tmpErr;
                ErrorCheck(ErrorName);
                return S_OK;
            }


такого кода уйма. Например в наличии имееться метод на ~2000 строк. Где наверное 80% точно проверяют всякие коды возврата.

хочу что-то типа такого...

    try
    {        
        //тут куча всего и всяких вызовов. после которых не надо выполнять проверку. была ошибка? пущай кидают ексепшины.
    }
    catch (_com_error err)
    {        
        FinishProcess(...
        errName = err.ErrorMessage();
        ErrorCheck(ErrorName);
    }
    catch (_simple_exception &se)
    {
        FinishProcess(....
        errName = se.GetMessage();
        ErrorCheck(ErrorName);
    }
    catch (...)
    {
        FinishProcess(...
        errName = "Occured unknown exception.";
        ErrorCheck(ErrorName);
    }


ввёл свой тип _simple_exception. где его внутри кидают.
но переход постепенный. всё сразу не переведёшь на эту модель. по сему как мне кажеться надо иметь чёткое разделение между методами кидающими исключения и нет. вот и рещил красиво задекларировать.

зы про неловить "catch (...)" слышал. не написать не поднимаеться рука......
Re[6]: Варнинг при декларировании функции кидающее исключени
От: BitField Украина http://lazy-bitfield.blogspot.com
Дата: 07.05.06 13:10
Оценка:
Здравствуйте, Аноним, Вы писали:



А>но переход постепенный. всё сразу не переведёшь на эту модель. по сему как мне кажеться надо иметь чёткое разделение между методами кидающими исключения и нет. вот и рещил красиво задекларировать.


Имхо, вполне достаточно комментария "/*throws bla_bla_exception if failed*/" и throw() -- для не кидающих.

Основная проблемы спецификации исключений:
1) Если Ваша ф-ция выбросит неспецифицированное исключение, программа будет завершена. Не каждый компилятор при компиляции может обнаружить такую опаснось. То есть Вам прийдется перечислить все исключения(ну, или их базовые), которые могут выбрасывать все ф-ции, вызываемые из Вашей.
2) Спецификация исключений не может быть частью типа при typedef-е, поэтому указатель на такую ф-цию Вы так просто не обьявите.

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