Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Qt неподдерживает exception. C чем это связано? Может на других OC нет их поддержки? 
:(
    Опции темы
djamshud
Дата 29.11.2009, 01:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>А может в "С/С++ Общие вопросы" ? ;)

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


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
maxxant
Дата 29.11.2009, 02:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 8.9.2009

Репутация: нет
Всего: 1



Цитата(sergey_85 @  28.11.2009,  08:55 Найти цитируемый пост)
С чем это связано, может из-за того, что QT кроссплатформенная и исключения не поддерживаются в какой-то ОС?

Я собираюсь делать кросплатформенную прогу, вот и думаю юзать мне exception (это же стандарт с++) или обойтиись без них как в qt?


Во первых не совсем верно "исключения не поддерживаются в какой-то ОС" - исключения С++ это исключения только от компилятора, и вопрос в том поддерживает их компилятор или нет, операционная система здесь не причём. Хотя есть исключение - это последние версии ОС Symbian, там они интегрированы в компилятор, вот ссылка на документ описывающий зачем и как http://developer.symbian.com/main/download...0Exceptions.pdf.
Поскольку Symbian это продукт Nokia, а теперь ей принадлежит и Qt, то для того чтобы сделать поддержку для S60 в Qt 4.6 просто необходимо обрабатывать исключения в самой библиотеке, именно поэтому там они и появились. Сама по себе Qt не генерирует исключения поскольку не все компиляторы это поддерживают ведь существуют и мало распростанённые ОС, где хорошо если С++ вообще есть. Тем не менее вы можете использовать исключения, как обычно в С++, если понимаете что делаете, хотя судя по вопросу, не понимаете ;)  так что лучше не надо, а то отлаживать будете долго и ругать невинный компилятор. При использовании Qt необходимость в исключениях отпадает сама  по себе, через механизм сигналов/слотов вы сможете не хуже других (ну почти) обрабатывать ошибки, н.р.: signals: void QTcpSocket::error ( QAbstractSocket::SocketError socketError ) подключили к слоту обработчика и обрабатывайте . С опытом использования Qt тяга к исключениям пройдёт. К тому же в больших проектах к исключениям относятся очень осторожно, поскольку их обработка плохо мастабируется (именно в С++, в других языках бывает по другому), и то что красиво смотриться в однопоточном приложении и практически независимом от библиотек проекте в несколько десятков файлов, может обернуться тихим ужасом и недельными отладками в более крупном, использующем несколько потоков (в каждом потоке свой стек, и не получиться передать исключения между ними, в отличие от сигнала ошибки в Qt).

Цитата(Lazin @  29.11.2009,  00:10 Найти цитируемый пост)
для которых недопустима потеря данных, есть приложения для которых недопустим простой, представь, что в каком-нибудь авиадиспетчерском центре упадет приложение, оно конечно перезпуститься, но во время простоя может случиться удивительное


К сожалению, в реальности, большинство допущенных и коварных ошибок не генеряться исключениями и не связаны с возвращаемыми значениями функций, хотя было бы здорово. Большинство ошибок - это логические упущения программиста или проектировка системы. Пример с авиадиспетчерским центром веселит, по случайному совпадению, я как раз являюсь разработчиком ПО для диспетчерских центров, и не вижу никакой связи между исключениями и потерей данных, скорее наоборот, слава богу их у нас практически нет, ибо их поддержка была бы кошмаром, даже в небольшом модуле с 10 потоками. Кроме того, все подсистемы дублируются и месяцами тестируются. Аргументы что исключения упрощают, документируют, делают надёжнее по моему относятся только к сравнительно несложным проектам, то есть их применение уместно, но весьма умеренно и всегда по максимуму локально. В прошлом приходилось работать тестировщиком над системами забугорных самолётов (автопилоты, мониторинг систем), ну там так вообще только чистый "си", поскольку компилятор на порядок проще и потенциально содержит меньше ошибок, плюс иногда двойное дублирование - две параллельно работающих платформы на разных архитектурах процессора с контролем работы плюс вторая такая же дублирующая.

PM MAIL   Вверх
andrew_121
Дата 29.11.2009, 02:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Цитата(djamshud @  29.11.2009,  01:54 Найти цитируемый пост)
Низя нам в общие вопросы ). 

Просто тема довольно интересная. Но увы, никому и в голову не придет, что это могут обсуждать в разделе по кроссплатформенному программированию. Сюда не так много народа заглядывает ;) А там вам и повеселее будет smile


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
djamshud
Дата 29.11.2009, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>ну там так вообще только чистый "си", поскольку компилятор на порядок проще и потенциально содержит меньше ошибок

Плюс си часто заставляет программиста писать более быстрый код, пусть временами и в ущерб понятности. Плюс сишный код впринципе работает быстрее, ибо классы, наследование, RTTI, исключения, опять же. Для автопилота это очень важно, я думаю.

maxxant, и вообще очень познавательная история.

>Просто тема довольно интересная

Да лишь бы в "священные войны" не отправили, там так вообще кроме троллей мало кто прочитает.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Lazin
Дата 29.11.2009, 02:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



djamshud, ладно, уговорил, не используй исключения smile 

Цитата(maxxant @  29.11.2009,  02:07 Найти цитируемый пост)
Во первых не совсем верно "исключения не поддерживаются в какой-то ОС" - исключения С++ это исключения только от компилятора, и вопрос в том поддерживает их компилятор или нет, операционная система здесь не причём
исключения поддерживаются именно на уровне операционной системы smile 

Цитата(maxxant @  29.11.2009,  02:07 Найти цитируемый пост)
К тому же в больших проектах к исключениям относятся очень осторожно, поскольку их обработка плохо мастабируется (именно в С++, в других языках бывает по другому), и то что красиво смотриться в однопоточном приложении и практически независимом от библиотек проекте в несколько десятков файлов, может обернуться тихим ужасом и недельными отладками в более крупном, использующем несколько потоков (в каждом потоке свой стек, и не получиться передать исключения между ними, в отличие от сигнала ошибки в Qt).

[irony]ну надо-же, в каждом потоке свой стек[/irony]
кстати, исключения можно передавать между потоками, поток, который делает join, потом заново их бросает, все получается довольно прозрачно
хозяйке на заметку: задача инженера - сделать реализацию простой, "просто" сделать сложнее чем сделать "сложно" smile 
поэтому кичиться тем, что у нас все сложно, поэтому мы не используем исключения - по меньшей мере странно, мы проектируем системы так, что-бы их потом было легко развивать искать в них ошибки, а исключения, при правильном использовании позволяют упростить систему, конечно можно сделать большую и сложную систему, и потом говорить, что если-бы мы использовали исключения, то была-бы вообще жопа...
вообще, стоит посмотреть на джавистов/дотнетчиков, они делают приложения, удовлетворяющие такому количеству бизнес правил, какое большинству цэпэпэ программистов и не снилось, и при этом пользуются исключениями

Цитата(maxxant @  29.11.2009,  02:07 Найти цитируемый пост)
Большинство ошибок - это логические упущения программиста или проектировка системы. 
ну еще-бы, обрабатывая все ошибки вручную ты конечно допустишь меньше логических ошибок smile 

Цитата(maxxant @  29.11.2009,  02:07 Найти цитируемый пост)
Пример с авиадиспетчерским центром веселит, по случайному совпадению, я как раз являюсь разработчиком ПО для диспетчерских центров, и не вижу никакой связи между исключениями и потерей данных, скорее наоборот, слава богу их у нас практически нет, ибо их поддержка была бы кошмаром, даже в небольшом модуле с 10 потоками.
по случайному совпадению, я то-же являюсь разработчиком ПО для диспетчерских центров, слава богу не авиационных, и исключения мы используем во всех проектах написанных на С++
> и не вижу никакой связи между исключениями и потерей данных 
есть связь между неиспользованием исключений и ростом сложности / увеличением количества ошибок, связных с тем, что разработчик не предусмотрел, что та или иная операция не всегда выполняется корректно, вот и все.

Добавлено через 1 минуту и 1 секунду
Цитата(djamshud @  29.11.2009,  02:26 Найти цитируемый пост)
Да лишь бы в "священные войны" не отправили

что в этом плохого, я весь вечер этого и добиваюсь smile 
PM MAIL Skype GTalk   Вверх
djamshud
Дата 29.11.2009, 02:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>djamshud, ладно, уговорил, не используй исключения

Т.е. вы отказываетесь показать хотя бы один случай, когда исключение спасет мир? Ну или хотя бы одну человеческую жизнь? То, что они усложняют сопровождение кода, я уже писал... И не получил ответа кстати.

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

Голословное заявление. Не видно связи между (не)использованием исключения и недосмотром за выполнением операций. Или вы в main городите один бааальшой перехватчик на все случаи жизни и обучаете его правильно реагировать на всевозможные ошибки, так, на всякий случай?


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Abyx
Дата 29.11.2009, 02:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: нет
Всего: 10



Цитата(djamshud @  29.11.2009,  02:26 Найти цитируемый пост)
Плюс сишный код впринципе работает быстрее, ибо классы, наследование

да..... наследование конечно тормозит выполнение кода....
PM MAIL   Вверх
djamshud
Дата 29.11.2009, 03:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>да..... наследование конечно тормозит выполнение кода.... 

Мда... Хождение по таблицам виртуальных функций уже давно выполняется на специализированном сопроцессоре и равносилен одному такту ЦПУ... Быстрота особенно ощущается при наследовании в несколько поколений - там включается турбонаддув сопроцессора... А когда среди этого где-нибудь мелькает множественное наследние, запускатеся реактивная тяга... Такие дела...

Добавлено @ 03:06
Речь естественно идет о полезном коде, накладные расходы в который не входят. И которые "тормозят" выполнение (полезного) кода.

Upd.
>исключения поддерживаются именно на уровне операционной системы
Всегда думал, что это не так. По-моему компилятор сам в силах решить, как бросать и ловить исключения. Поделитесь ссылкой, где бы об этом поподробнее рассказывалось? Нагуглить с ходу не получилось.

Это сообщение отредактировал(а) djamshud - 29.11.2009, 03:18


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
maxxant
Дата 29.11.2009, 03:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 8.9.2009

Репутация: нет
Всего: 1



2Lazin:
Цитата(Lazin @  29.11.2009,  02:32 Найти цитируемый пост)
исключения поддерживаются именно на уровне операционной системы  


мы говорим, про исключения С++, каким боком они привязаны к операционке. То что в операционных системах  MS Windows есть SEH, то что в юниксах есть сигналы, и исключения возникающие на уровне процессора при попытке обращения к памяти, деления на ноль и т.д. мы знаем, и как то, что это обрабатывается в операционке понятно. Только причём здесь исключения С++ ???. Они реализовываются вполне программно.

Цитата(Lazin @  29.11.2009,  02:32 Найти цитируемый пост)
[irony]ну надо-же, в каждом потоке свой стек[/irony]


отчего ирония? Как бы локальные объекты в каждом потоке живут не зависимо, и крутят свой стек в разные стороны одновременно.

Цитата(Lazin @  29.11.2009,  02:32 Найти цитируемый пост)
кстати, исключения можно передавать между потоками, поток, который делает join, потом заново их бросает, все получается довольно прозрачно

это что C# ?

Цитата(Lazin @  29.11.2009,  02:32 Найти цитируемый пост)
стоит посмотреть на джавистов/дотнетчиков, они делают приложения, удовлетворяющие такому количеству бизнес правил, какое большинству цэпэпэ программистов и не снилось, и при этом пользуются исключениями


Выше я упомянул, что в некоторых языках по другому. В java или .net исключения - это основной способ обработки ошибок. Причем здесь C++ Qt?

Цитата(Lazin @  29.11.2009,  02:32 Найти цитируемый пост)
есть связь между неиспользованием исключений и ростом сложности / увеличением количества ошибок, связных с тем, что разработчик не предусмотрел, что та или иная операция не всегда выполняется корректно, вот и все.


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

Цитата(Lazin @  29.11.2009,  02:32 Найти цитируемый пост)
по случайному совпадению, я то-же являюсь разработчиком ПО для диспетчерских центров, слава богу не авиационных, и исключения мы используем во всех проектах написанных на С++.


Как замечательно. И насколько хорошо у вас они сочетаются с Qt? Какие подводные камни могут встретиться при их использовании с Qt? Чувствуется ли их острая неоходимость? Может у вас ещё boost прикручен поэтому уж без них никак не получается? А может вы путается С++ с  С#  или ещё с чем, где есть полноценная поддерка исключений(если можно так сказать)?



Это сообщение отредактировал(а) maxxant - 29.11.2009, 04:04
PM MAIL   Вверх
maxxant
Дата 29.11.2009, 03:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 8.9.2009

Репутация: нет
Всего: 1



Цитата(djamshud @ 29.11.2009,  02:26)
>ну там так вообще только чистый "си", поскольку компилятор на порядок проще и потенциально содержит меньше ошибок

Плюс си часто заставляет программиста писать более быстрый код, пусть временами и в ущерб понятности. Плюс сишный код впринципе работает быстрее, ибо классы, наследование, RTTI, исключения, опять же. Для автопилота это очень важно, я думаю.

Тут больше конечно надёжность, ибо по международным требованиям: DO-178b многое нужно проверить. В том числе полное покрытие кода,  т.е. компилируется инструментированный код, с помощью которого можно проверить; все ли операторы, функции, условия выполнились, и если что-то не выполняется, делается подробный анализ с отчётом об ошибке, либо обоснованием что всё нормально и этот код мёртвый, т.е default в свитчах и т.п. кот при данных условиях не выполняются. В с++ это очень сложно сделать даже используя в пол-мощи.

Да и кстати да, там только realtime всегда, и никакого динамического выделения памяти, динамических загрузок чего либо. то есть от С++ толку в той области очень немного, а проблем вагон (не говоря про стоимость сертифицированных компиляторов для этого дела, только сишный компилятор для небольшого офиса (человек 10-15) с урезанной лицензией на 1 тип процессора из 20 возможных, чтобы купить нужно  квартиру в Москве продать, и причём для каждого филиала отдельная лицензия нужна - сервера лицензий, аудиты, ...).

Это сообщение отредактировал(а) maxxant - 29.11.2009, 04:31
PM MAIL   Вверх
Lazin
Дата 29.11.2009, 12:50 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(djamshud @  29.11.2009,  02:49 Найти цитируемый пост)
Т.е. вы отказываетесь показать хотя бы один случай, когда исключение спасет мир? Ну или хотя бы одну человеческую жизнь? То, что они усложняют сопровождение кода, я уже писал... И не получил ответа кстати.
все ждут пример, затаив дыхание smile
вариант с кодами ошибок:
Код

enum {
    NO_CONNECTION,
    CANT_OPEN_FILE,
    IO_ERROR,
    CONNECTION_CLOSE_ERROR,
    FILE_CLOSE_ERROR
};

int ReceiveFile(MyTCPConnection* connection, std::string file_name)
{
    if (connection->operable() == false)
        return NO_CONNECTION;
        
    MyFile file(file_name);
    if (file.open() == false)
        return CANT_OPEN_FILE;
        
    char buff[0x10000];
    while(true)
    {
        ErrorCode ec;
        size_t bytes_transferred = 
            connection->readsome(make_buffer(buff, 0x10000), &ec);
            
        if (ec == MyTCPConnection::EOF)
            break;
        
        if (ec)
            return IO_ERROR;
            
        if (!file.write(buff, bytes_transverred))
        {
            LOG_ERROR(("File I/O error - write"));
            return IO_ERROR;
        }
    }
    
    if (!connection->close())
        return CONNECTION_CLOSE_ERROR;
    
    if (!file.close())
    {
        LOG_ERROR(("File I/O error - close"));
        return FILE_CLOSE_ERROR;
    }
    return 0;
}

void HigerLevel()
{
    ...
    int ec = ReceiveFile(connection, name);
    switch(ec)
    {
    case NO_CONNECTION:
    {
        int ec = connection->open();
        if (ec)
        {
            ...
        }
        HigherLevel(); // retry
    }
    break;
    case CANT_OPEN_FILE:
    {
        name = get_alernative_filename();
        HigherLevel();
    }
    break;
    ...
    };
    ...
}

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

void ReceiveFile(MyTCPConnection* connection, std::string file_name)
{
    if (connection->operable() == false)
        throw TCPException("ReceiveFile can work only with alredy opend connection");

    MyFile file(file_name);
    file.open();
    char buff[0x10000];
    while(true)
    {
        size_t bytes_transferred = connection->readsome(make_buffer(buff, 0x10000));
        
        if (connection->is_eof())
            return break;
            
        file.write(buff, bytes_transverred);
    }
    connection->close();
    file.close();
}

void HigherLevel()
{
    ...
    try
    {
        ReceiveFile(connection, filename);
    }
    catch(TCPException const& e)
    {
        Reconnect();
        HigherLevel();
    }
    catch(FileError const& e)
    {
        if (e->code() != MyFile::CantOpen)
            throw;
        filename = get_alternative_filename();
        ReceiveFile();
    }
}

как видим, все то-же самое, только проверка ошибок автоматизирована, не нужно проверять что вернет каждая из-функций, вышестоящий уровень перехватывает те ошибки, которые он может исправить, остальные идут еще выше и обрабатываются там, к примеру, если не удается открыть файл - создается файл в другом месте и все повторяется, а если произошло что-то более серьезное, исключение идет дальше

нетрудно заметить, что во втором варианте намного меньше boilerplate кода, к тому-же в первом варианте непонятно как передавать системные коды ошибок

Это сообщение отредактировал(а) Lazin - 29.11.2009, 12:55
PM MAIL Skype GTalk   Вверх
Lazin
Дата 29.11.2009, 13:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 4
Всего: 154



Цитата(djamshud @  29.11.2009,  03:04 Найти цитируемый пост)
Мда... Хождение по таблицам виртуальных функций уже давно выполняется на специализированном сопроцессоре и равносилен одному такту ЦПУ... Быстрота особенно ощущается при наследовании в несколько поколений - там включается турбонаддув сопроцессора... А когда среди этого где-нибудь мелькает множественное наследние, запускатеся реактивная тяга... Такие дела...
деревня smile
при наследовании не создается куча таблиц вирт. функций, там по прежнему одна таблица, в самом объекте будет просто храниться указатель на таблицу, вот и все, к тому-же можно наследовать от класса, не содержащего вирт. функций
То-есть вызов вирт-функции в наследнике и в родителе - одинаков, это получение указателя на ф-ю и вызов этой ф-ии, очень дешевая операция.

Цитата(djamshud @  29.11.2009,  03:04 Найти цитируемый пост)
Всегда думал, что это не так. По-моему компилятор сам в силах решить, как бросать и ловить исключения. Поделитесь ссылкой, где бы об этом поподробнее рассказывалось? Нагуглить с ходу не получилось.

Цитата(maxxant @  29.11.2009,  03:22 Найти цитируемый пост)
мы говорим, про исключения С++, каким боком они привязаны к операционке. То что в операционных системах  MS Windows есть SEH, то что в юниксах есть сигналы, и исключения возникающие на уровне процессора при попытке обращения к памяти, деления на ноль и т.д. мы знаем, и как то, что это обрабатывается в операционке понятно. Только причём здесь исключения С++ ???. Они реализовываются вполне программно.
в компиляторе VC++, оператор throw - реализуется через RaiseException, тоесть все исключения работают через SEH, и исключения С++(синхронные) и системные исключения (асинхронные), просто по дефолту, компилятор обрабатывает только C++ исключения, можно сделать так, что в вашей программе появятся такие исключения как AVException, DivByZeroException итд
в *nix ах наверное то-же так можно сделать smile 

Цитата(maxxant @  29.11.2009,  03:22 Найти цитируемый пост)
отчего ирония? Как бы локальные объекты в каждом потоке живут не зависимо, и крутят свой стек в разные стороны одновременно.
ну это как-бы очевидно настолько, что Капитан Очевидность удавился от зависти smile 

Цитата(maxxant @  29.11.2009,  03:22 Найти цитируемый пост)
это что C# ?
нет, join, это то место, где основной поток дожидается завершения дочернего, примерно так:
Код

boost::thread thread(backgroundWorker);
...
thread.join();
if (backgroundWorker.failed())
    backgroundWorker.throw_error();
в С++ это реализуется кривыми руками программиста

Цитата(maxxant @  29.11.2009,  03:22 Найти цитируемый пост)
Выше я упомянул, что в некоторых языках по другому. В java или .net исключения - это основной способ обработки ошибок. Причем здесь C++ Qt?
в С++ - исключения - основной инструмент обработки ошибок, даже new бросает исключение, нельзя их игнорировать если не пишешь на Си конечно smile 

Цитата(maxxant @  29.11.2009,  03:22 Найти цитируемый пост)
логически некорректная операция на С++ не вызывает исключений, если это не задано явно через throw, даже деление на ноль, выход за пределы памяти вызывают системное исключение, либо сигнал. Исключения в С++ позволяют лишь  локально, модульно упростить написание кода. В сочетании с  Qt потребность в них практически отпадает, да и пользоваться осторожнее приходиться.
Чувствуется вы потроллить сюда пришли.
прежде чем обвинять кого-либо в троллинге и некомпетентности, нужно самому научиться разбираться в вопросе, системные исключения можно транслировать в исключения С++(типизировать), их можно перехватывать через catch(...) (игнорировать тип)

Цитата(maxxant @  29.11.2009,  03:22 Найти цитируемый пост)
Как замечательно. И насколько хорошо у вас они сочетаются с Qt?
я не использую Qt, я вообще не пишу приложения с пользовательским интерфейсом

Цитата(maxxant @  29.11.2009,  03:22 Найти цитируемый пост)
Может у вас ещё boost прикручен поэтому уж без них никак не получается? А может вы путается С++ с  С#  или ещё с чем, где есть полноценная поддерка исключений(если можно так сказать)?
естественно я использую boost, STL и много чего еще, и это не мешает мне писать приложения, работающие в режиме 24x7
нельзя использовать ни одну современную С++ библиотеку, не используя исключения

PM MAIL Skype GTalk   Вверх
andrew_121
Дата 29.11.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: нет
Всего: 33



Вах. Дочитал smile


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
djamshud
Дата 29.11.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 1
Всего: 39



>деревня

Ок. Маленький бенчмарк (полностью высосанный из пальца) для горожан. Вызывается (используется) всего пять методов.
Код

virtual void B1::A_a()
virtual void A::A_a()
virtual void D::A_b()
virtual void D::C_a()
virtual void E::C_b()

для случая _1. И пять обыкновенных методов для случая _2.

Код

#include<stdio.h>                      
#define printf(...)
#define _1

#ifdef _1
class A{ 
public:  
virtual void A_a(){printf("%s\n",__PRETTY_FUNCTION__);}
virtual void A_b()=0;                                  
};                                                     

class B1:virtual public A{
public:                   
virtual void A_a(){       
printf("%s\n",__PRETTY_FUNCTION__);
A::A_a();}                         
};                                 

class B2:virtual public A{};

class C:public B1,public B2{
public:
virtual void C_a(){printf("%s\n",__PRETTY_FUNCTION__);}
virtual void C_b()=0;
};

class D:public C{
public:
void C_a(){printf("%s\n",__PRETTY_FUNCTION__);}
void A_b(){printf("%s\n",__PRETTY_FUNCTION__);}
};

class E:public D{
public:
void C_b(){printf("%s\n",__PRETTY_FUNCTION__);}
};
#endif

#ifdef _2
class C{
public:
void c1(){}
void c2(){}
void c3(){}
void c4(){}
void c5(){}
};
#endif



int main(){
#ifdef _1
C *object=new E;
for(int i=0;i<99999999;i++){
object->A_a();
object->A_b();
object->C_a();
object->C_b();
//break;
}
#endif

#ifdef _2
C *object=new C;
for(int i=0;i<99999999;i++){
object->c1();
object->c2();
object->c3();
object->c4();
object->c5();}
#endif

delete object;
return 0;
}



Случай _1:
real    0m1.891s
real    0m1.887s
real    0m1.910s

Случай _2:
real    0m1.170s
real    0m1.178s
real    0m1.177s

Итого ~0.73 секунды простоя на 100 миллионов вызовов. Сишники могут порадоваться, их время меньше секунды.

>можно наследовать от класса, не содержащего вирт. функций

Можно. Но мы говорим о реальном использовании наследования, а это много виртуальных функций. Может быть не всегда, но на моей практике это обычно именно так.

>в *nix ах наверное то-же так можно сделать

Можно, но не нужно. К счастью оказалось, что операционка ничего не знает о плюсовых исключениях, и это правильно, я считаю. Мир не перевернулся.

Lazin, пример с ексепшином и кодом возврата посмотрю чуть позже.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
W4FhLF
Дата 29.11.2009, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121



Цитата(djamshud @  29.11.2009,  14:53 Найти цитируемый пост)
Итого ~0.73 секунды простоя на 100 миллионов вызовов. Сишники могут порадоваться, их время меньше секунды.


Если методы в классе делают что-то сложнее "a + b", то оверхед на вызов будет очень мал относительно исполнения всего кода. 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила ведения Религиозных войн
Smartov
1. Уважайте собеседника
2. Собеседник != враг
3. Старайтесь воздерживаться от тем вида "Windows Rulez" или "Linux Rulez"

С уважением, Smartov.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Религиозные войны | Следующая тема »


 




[ Время генерации скрипта: 0.1431 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.