Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
#1

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

21.10.2012, 11:11. Просмотров 1009. Ответов 14
Метки нет (Все метки)

Насколько разумно использовать throw вместо return? И является ли throw более медленным?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2012, 11:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Насколько разумно использовать throw вместо return (C++):

Как использовать оператор return? - C++
При запуске возникает ошибка, связанная с тем, что функция должна вернуть значение. Подскажите, что требуется подставить для return (строки...

В чем разница между return и return false/true - C++
Привет всем. Вот подскажите плиз) return; return false; return true; расскажите пожалуйста об етих операторах.. чем они...

Использовать вместо массивов - указатели - C++
Помогите переписать, чтоб вместо массивов были показатели! #include <iostream> #include <math.h> using namespace std; int main()...

Использовать Vector вместо array - C++
Помогите, пожалуйста, переписать программу чтобы заменить array на Vector : // Sorting an Array #include <iostream> ...

Редактировать программу, вместо for использовать цикл while - C++
Задача-написать программу, которая в однонаравленном списке из вещестенных чисел перед каждым числом =20 вставить первый отрицательный...

Использовать new вместо обьявления массива из трех структур - C++
//хелп, использовать new вместо обьявления массива из трех структур, намекните куда мне думать... #include "stdafx.h" #include...

14
Toshkarik
1147 / 864 / 51
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 1
21.10.2012, 11:18 #2
Это два разных оператор для разных целей, сравнивать их не имеет смысла, тем более сравнивать их производительность.
0
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
21.10.2012, 11:33 #3
Обработка исключений - штука весьма медленная, и предназначена именно для исключительных ситуаций, когда нормальное продолжение работы невозможно. Что, кстати, напоминает мне безумный комментарий из документации к MaxScript, встроенному языку 3DS Max, где они не рекомендуют пользоваться тамошним оператором return и кое-какими другими конструкциями, потому что они реализованы через исключения, и скрипты с такими конструкциями будут медленно работать.
1
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
21.10.2012, 13:39 #4
Я бы сказал, что нужно использовать throw, когда результат, возвращаемый return, не может быть получен (неправильные параметры, не открылся файл, короче, результат невозможно вычислить) и return в противном случае.
1
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
24.10.2012, 12:30 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Подведём итог. Ответ на вопрос "Насколько разумно использовать throw вместо return?": это не разумно, это безумно
3
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 249
24.10.2012, 13:02 #6
Часто использовать throw, значит возникает необходимость часто оборачивать функцию в try и прописывать catch-и. Код становиться сильно "зашумленным". Читать такой код будет сложновато и становиться непонятно - ведь в таких случаях под функцией понимает (в данном случае) тот элемент, которому мы передаем параметры и получаем от нее какой-то результат. Именно получаем, а не ловим.
Еще круче будет такой класс вынести в какую-то общую библиотечку. Я не буду просматривать то, что там написано, я буду смотреть на сигнатуру, которая мне подскажет что с данной функцией я могу сделать. А писать try и catch постоянно мне тоже не хочется.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.10.2012, 14:25 #7
StasGamilton, noexcept, если функция не может кидать исключения, не?
0
StasGamilton
Эксперт по пяченькам
67 / 67 / 1
Регистрация: 16.08.2011
Сообщений: 249
24.10.2012, 14:47 #8
ForEveR, ну я вообще-то про вопрос разумности использования throw вместо return. Я не сталкивался с noexcept, честно сказать впервый раз от Вас услышал, но быстренько найдя немного информации, прихожу к выводу что это noexcept тут не к месту.

Не по теме:

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

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

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

Добавлено через 2 минуты
Даже если я пойму, что он выкидывает исключение, то встанет другой вопрос: какое исключение он выкинет? Хорошо, если будут хорошие комментарии, которые позволят отобразить необходимую информацию в качестве подсказки в современных IDE.
0
Psilon
Master of Orion
Эксперт .NET
5912 / 4809 / 634
Регистрация: 10.07.2011
Сообщений: 14,409
Записей в блоге: 5
Завершенные тесты: 4
24.10.2012, 15:24 #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
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.10.2012, 15:35 #12
Psilon, Зато безопасный.
0
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
24.10.2012, 15:58  [ТС] #13
ForEveR, чем опасней язык, тем больше возможностей.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
24.10.2012, 16:02 #14
Kgfq, ...выстрелить себе в ногу. Согласен конечно, да. Вот только, не столь часто нужны эти возможности. Тема для холивара, потому развивать не планирую.
0
silent_1991
25.10.2012, 12:11     Насколько разумно использовать throw вместо return
  #15
 Комментарий модератора 
Psilon, ForEveR, Kgfq, это уже выходит за рамки данного обсуждения, так что прекращайте, ребята, холиварить.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2012, 12:11
Привет! Вот еще темы с ответами:

Как вместо char* использовать vector<string>? - C++
Здравствуйте, можете объяснить, как это сделать или проще привести какой-нибудь пример, чтобы стало понятно, как это применить к своей...

Изменить способ выделения памяти для массива (вместо new использовать malloc) - C++
#include &quot;stdafx.h&quot; #include &quot;stdlib.h&quot; struct str_Team{ char Komanda; int Ochki; int Gold; int Silver; int...

Как сделать так, что если файл существует return true, если нет - return false - C++
Здравствуйте, я новичок в программировании. Мой вопрос очень прост: как сделать так, что если файл существует return true если нет return...

Как разумно получить доступ к приватной переменной - C++
Есть в классе приватная переменная clientName. Мне нужно защитить ее так, чтобы для внешних классов она была только для чтения. Не...


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

Или воспользуйтесь поиском по форуму:
15
25.10.2012, 12:11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.