Форум программистов, компьютерный форум CyberForum.ru

Насколько разумно использовать throw вместо return - C++

Восстановить пароль Регистрация
 
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
21.10.2012, 11:11     Насколько разумно использовать throw вместо return #1
Насколько разумно использовать throw вместо return? И является ли throw более медленным?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
21.10.2012, 11:18     Насколько разумно использовать throw вместо return #2
Это два разных оператор для разных целей, сравнивать их не имеет смысла, тем более сравнивать их производительность.
Nick Alte
Эксперт С++
1561 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,896
Завершенные тесты: 1
21.10.2012, 11:33     Насколько разумно использовать throw вместо return #3
Обработка исключений - штука весьма медленная, и предназначена именно для исключительных ситуаций, когда нормальное продолжение работы невозможно. Что, кстати, напоминает мне безумный комментарий из документации к MaxScript, встроенному языку 3DS Max, где они не рекомендуют пользоваться тамошним оператором return и кое-какими другими конструкциями, потому что они реализованы через исключения, и скрипты с такими конструкциями будут медленно работать.
soft.creator
 Аватар для soft.creator
103 / 103 / 4
Регистрация: 17.10.2010
Сообщений: 283
21.10.2012, 13:39     Насколько разумно использовать throw вместо return #4
Я бы сказал, что нужно использовать throw, когда результат, возвращаемый return, не может быть получен (неправильные параметры, не открылся файл, короче, результат невозможно вычислить) и return в противном случае.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.10.2012, 12:30     Насколько разумно использовать throw вместо return #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Подведём итог. Ответ на вопрос "Насколько разумно использовать throw вместо return?": это не разумно, это безумно
StasGamilton
Эксперт по пяченькам
 Аватар для StasGamilton
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
24.10.2012, 13:02     Насколько разумно использовать throw вместо return #6
Часто использовать throw, значит возникает необходимость часто оборачивать функцию в try и прописывать catch-и. Код становиться сильно "зашумленным". Читать такой код будет сложновато и становиться непонятно - ведь в таких случаях под функцией понимает (в данном случае) тот элемент, которому мы передаем параметры и получаем от нее какой-то результат. Именно получаем, а не ловим.
Еще круче будет такой класс вынести в какую-то общую библиотечку. Я не буду просматривать то, что там написано, я буду смотреть на сигнатуру, которая мне подскажет что с данной функцией я могу сделать. А писать try и catch постоянно мне тоже не хочется.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.10.2012, 14:25     Насколько разумно использовать throw вместо return #7
StasGamilton, noexcept, если функция не может кидать исключения, не?
StasGamilton
Эксперт по пяченькам
 Аватар для StasGamilton
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
24.10.2012, 14:47     Насколько разумно использовать throw вместо return #8
ForEveR, ну я вообще-то про вопрос разумности использования throw вместо return. Я не сталкивался с noexcept, честно сказать впервый раз от Вас услышал, но быстренько найдя немного информации, прихожу к выводу что это noexcept тут не к месту.

Не по теме:

.Но хочу подчеркнуть, что инфу искал на скорую руку и сейчас у меня нет времени ее изучать.

ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.10.2012, 14:52     Насколько разумно использовать throw вместо return #9
StasGamilton, Кхм. Я не призываю использовать throw вместо return. Абсолютно разные вещи.
Я говорил об этом:
Я не буду просматривать то, что там написано, я буду смотреть на сигнатуру, которая мне подскажет что с данной функцией я могу сделать. А писать try и catch постоянно мне тоже не хочется.
Если в сигнатуре функции стоит noexcept(true) - она не будет кидать исключений.
StasGamilton
Эксперт по пяченькам
 Аватар для StasGamilton
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 258
24.10.2012, 15:19     Насколько разумно использовать throw вместо return #10
Цитата Сообщение от ForEveR Посмотреть сообщение
Я не призываю использовать throw вместо return
Честно даже и не подумал про это

Цитата Сообщение от ForEveR Посмотреть сообщение
Если в сигнатуре функции стоит noexcept(true) - она не будет кидать исключений.
Это я понял. Просто если человек использует вместо return throw, то в сигнатуре функции не будет noexcept, но для меня это не скажет о том, что нужно сделать - получить данные из функции или их поймать

Добавлено через 2 минуты
Даже если я пойму, что он выкидывает исключение, то встанет другой вопрос: какое исключение он выкинет? Хорошо, если будут хорошие комментарии, которые позволят отобразить необходимую информацию в качестве подсказки в современных IDE.
Psilon
Master of Orion
 Аватар для Psilon
5737 / 4685 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
24.10.2012, 15:24     Насколько разумно использовать throw вместо return #11
Становится понятно, почему шарп такой медленный...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        [System.Security.SecuritySafeCritical]  // auto-generated 
        internal unsafe static Int32 ParseInt32(String s, NumberStyles style, NumberFormatInfo info) {
 
            Byte * numberBufferBytes = stackalloc Byte[NumberBuffer.NumberBufferBytes];
            NumberBuffer number = new NumberBuffer(numberBufferBytes); 
            Int32 i = 0;
 
            StringToNumber(s, style, ref number, info, false); 
 
            if ((style & NumberStyles.AllowHexSpecifier) != 0) { 
                if (!HexNumberToInt32(ref number, ref i)) {
                    throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
                }
            } 
            else {
                if (!NumberToInt32(ref number, ref i)) { 
                    throw new OverflowException(Environment.GetResourceString("Overflow_Int32")); 
                }
            } 
            return i;
        }
В методе на 4 строчки 2 вызова исключения D
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.10.2012, 15:35     Насколько разумно использовать throw вместо return #12
Psilon, Зато безопасный.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
24.10.2012, 15:58  [ТС]     Насколько разумно использовать throw вместо return #13
ForEveR, чем опасней язык, тем больше возможностей.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.10.2012, 16:02     Насколько разумно использовать throw вместо return #14
Kgfq, ...выстрелить себе в ногу. Согласен конечно, да. Вот только, не столь часто нужны эти возможности. Тема для холивара, потому развивать не планирую.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2012, 12:11     Насколько разумно использовать throw вместо return
Еще ссылки по теме:

C++ Как разумно получить доступ к приватной переменной
C++ Что использовать вместо таймера для множества точек, жизнь которых - 5 секунд
C++ Как вместо char* использовать vector<string>?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
silent_1991
25.10.2012, 12:11     Насколько разумно использовать throw вместо return
  #15
 Комментарий модератора 
Psilon, ForEveR, Kgfq, это уже выходит за рамки данного обсуждения, так что прекращайте, ребята, холиварить.
Yandex
Объявления
25.10.2012, 12:11     Насколько разумно использовать throw вместо return
Ответ Создать тему
Опции темы

Текущее время: 08:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru