да, по логике описания к примеру очень подходит! теперь этот пункт ясен.
а почему исключение ловят по значению, а не по ссылке? это второй мой вопрос по семплу. спасибо.
Здравствуйте, varnie, Вы писали:
V>Здравствуйте, Pretender, Вы писали:
V>да, по логике описания к примеру очень подходит! теперь этот пункт ясен. V>а почему исключение ловят по значению, а не по ссылке? это второй мой вопрос по семплу. спасибо.
Этого я и не приметил. Думаю, это какая-нибудь ошибка переписчика. Незнаю этому оправдание.
Здравствуйте, Pretender, Вы писали:
P>Здравствуйте, varnie, Вы писали:
V>>хочу узнать, почему бы не сделать вот так:
P>Потому что ошибка с одним студентом не должна означать, что обработка студентов прервана. В твоём же примере первое же исключение прервёт цикл.
А где там ошибка может быть? С одним студентом.
try (при данном коде) лучше действительно вынести за пределы цикла.
Можно сделать по разному ... и будет работать.
А разница в том, что в первом примере при возникновении исключения цикл не прервется, а во втором, при возникновении исключения цикл прерывается и дальнейшего перебора нет.
Вывод: первый пример (из книги) более правильный. (Кстати второй пример более быстрый с точки зрения кода)
Доброго времени суток! Мир Вам! С уважением Clevelus.
Если мой ответ понравился — оцените, ни на что не влияет, но будет приятно.
Здравствуйте, Pretender, Вы писали:
P>Здравствуйте, c-smile, Вы писали:
CS>>А где там ошибка может быть? С одним студентом.
P>Не поленился, снял книгу с верхней полки, цитирую:
Если студент не выполнил ни одного домашнего задания, в процессе пычисления будет сгенерировано исключение.
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, Pretender, Вы писали:
P>>Здравствуйте, c-smile, Вы писали:
CS>>>А где там ошибка может быть? С одним студентом.
P>>Не поленился, снял книгу с верхней полки, цитирую:
Если студент не выполнил ни одного домашнего задания, в процессе пычисления будет сгенерировано исключение.
CS>Где?
кстати, да, подобной мысли на протяжении этого параграфа в книге не нашел, но по логике с предметом и задачей приведенного примера сходится.
Здравствуйте, varnie, Вы писали:
CS>>>>А где там ошибка может быть? С одним студентом.
P>>>Не поленился, снял книгу с верхней полки, цитирую:
Если студент не выполнил ни одного домашнего задания, в процессе пычисления будет сгенерировано исключение.
CS>>Где?
V>кстати, да, подобной мысли на протяжении этого параграфа в книге не нашел, но по логике с предметом и задачей приведенного примера сходится.
Что? (сходится)
Где там в теле цикла может генерироваться std::domain_error ?
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, varnie, Вы писали:
CS>>>>>А где там ошибка может быть? С одним студентом.
P>>>>Не поленился, снял книгу с верхней полки, цитирую:
Если студент не выполнил ни одного домашнего задания, в процессе пычисления будет сгенерировано исключение.
CS>>>Где?
V>>кстати, да, подобной мысли на протяжении этого параграфа в книге не нашел, но по логике с предметом и задачей приведенного примера сходится.
CS>Что? (сходится)
CS>Где там в теле цикла может генерироваться std::domain_error ?
на 78 стр. имплементирована ф-ция grade
/*
вычисляем итоговую оценку студента на основе оценок, полученных на экзаменах в середине и конце семестра,
а также на основе вектора оценок за выполнение домашних заданий,
эта ф-ия не копирует свой аргумент, т.к. ф-ция median делает это за нас.
*/double grade(double midterm, double final, const vector<double>& hw)
{
if (hw.size() == 0)
throw domain_error("студент не сделал ни одного домашнего задания");
return grade(midterm, final, median(hw));
}
которая и генерирует исключение в случае отсутствия выполненных заданий у студента
Здравствуйте, varnie, Вы писали:
CS>>Где там в теле цикла может генерироваться std::domain_error ?
V>на 78 стр. имплементирована ф-ция grade V>
V>/*
V>вычисляем итоговую оценку студента на основе оценок, полученных на экзаменах в середине и конце семестра,
V>а также на основе вектора оценок за выполнение домашних заданий,
V>эта ф-ия не копирует свой аргумент, т.к. ф-ция median делает это за нас.
V>*/
V>double grade(double midterm, double final, const vector<double>& hw)
V>{
V> if (hw.size() == 0)
V> throw domain_error("студент не сделал ни одного домашнего задания");
V> return grade(midterm, final, median(hw));
V>}
V>
V>которая и генерирует исключение в случае отсутствия выполненных заданий у студента
Давай я тебя уже тогда по английски спрошу если уж по русски не полючается понять.
Здравствуйте, Pretender, Вы писали:
P>Здравствуйте, c-smile, Вы писали:
P>В моей книжке вот эта строчка:
P>
P> double final_grade = students[i].grade;
P>
P>Выглядит так:
P>
P> double final_grade = grade(students[i]);
P>
Вот. Дьявол он в деталях.
Тут люди уже чуть морды бить не начали и теории тотального шастя возводить, а оказывается тот try/catch там вообще не нужен. Нигде.
P>Страница 90, вверху.
Оставим этот косяк на совести Кёнига, может быть он просто забил на секундочку на опасность срезки или решил в учебном примере об этом вообще не запариваться. Давайте я поясню что имел в виду, ловя исключение внутри цикла. У нас есть список студентов. Для каждого нужно либо вывести среднюю оценку, либо строчку что он забил на учёбу Если вы поймаете исключение вне цикла, то если студент #3 забил на учёбу, то до студента #4 очередь просто не дойдёт.
Хочу также добавить что в production-quality code такой оверхед по времени выполнения на ситуацию, не являющуюся исключительной на самом деле (разве есть нечто исключительное в том, чтобы студент забил на занятия?) никто на ревью не пропустит. Так что в качестве домашнего задания можете переписать функцию grade так, чтобы она не кидала лишних исключений и соответственно убрать лишние try/catch из тела цикла.
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.