пример из книги: цикл + try/catch
От: varnie  
Дата: 12.07.08 17:39
Оценка:
в книге "эффективное программирование на С++" авторов Э. Кёниг и Б. Му есть такой семпл:
//...
for (vector<Core>::size_type i = 0; i != students.size(); ++i){
  cout << students[i].name() << string(maxlen + 1 - students[i].name.size());
  try{
    double final_grade = students[i].grade;
    streamsize prec = cout.presision();
    cout << setprecision(3) << final_grade << setprecision(prec) << endl;
  } catch(doman_error e){
    cout << e.what() << endl;
  }
}

хочу узнать, почему бы не сделать вот так:
//...
try{
  for (vector<Core>::size_type i = 0; i != students.size(); ++i){
    cout << students[i].name() << string(maxlen + 1 - students[i].name.size());
      double final_grade = students[i].grade;
      streamsize prec = cout.presision();
      cout << setprecision(3) << final_grade << setprecision(prec) << endl;
  }
} catch(doman_error &e){
    cout << e.what() << endl;
}

?
признателен пояснениям.
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
Re: пример из книги: цикл + try/catch
От: Pretender  
Дата: 12.07.08 18:09
Оценка:
Здравствуйте, varnie, Вы писали:

V>хочу узнать, почему бы не сделать вот так:

V>//...
V>?
V>признателен пояснениям.

Потому что ошибка с одним студентом не должна означать, что обработка студентов прервана. В твоём же примере первое же исключение прервёт цикл.
Re[2]: пример из книги: цикл + try/catch
От: varnie  
Дата: 12.07.08 18:54
Оценка:
Здравствуйте, Pretender, Вы писали:

да, по логике описания к примеру очень подходит! теперь этот пункт ясен.
а почему исключение ловят по значению, а не по ссылке? это второй мой вопрос по семплу. спасибо.
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
Re[3]: пример из книги: цикл + try/catch
От: Pretender  
Дата: 13.07.08 07:00
Оценка:
Здравствуйте, varnie, Вы писали:

V>Здравствуйте, Pretender, Вы писали:


V>да, по логике описания к примеру очень подходит! теперь этот пункт ясен.

V>а почему исключение ловят по значению, а не по ссылке? это второй мой вопрос по семплу. спасибо.

Этого я и не приметил. Думаю, это какая-нибудь ошибка переписчика. Незнаю этому оправдание.
Re[2]: пример из книги: цикл + try/catch
От: c-smile Канада http://terrainformatica.com
Дата: 13.07.08 07:30
Оценка:
Здравствуйте, Pretender, Вы писали:

P>Здравствуйте, varnie, Вы писали:


V>>хочу узнать, почему бы не сделать вот так:


P>Потому что ошибка с одним студентом не должна означать, что обработка студентов прервана. В твоём же примере первое же исключение прервёт цикл.


А где там ошибка может быть? С одним студентом.

try (при данном коде) лучше действительно вынести за пределы цикла.
Re[3]: пример из книги: цикл + try/catch
От: Pretender  
Дата: 13.07.08 07:38
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>А где там ошибка может быть? С одним студентом.


Не поленился, снял книгу с верхней полки, цитирую:

Если студент не выполнил ни одного домашнего задания, в процессе пычисления будет сгенерировано исключение.

Re[4]: пример из книги: цикл + try/catch
От: oziro Нигерия  
Дата: 13.07.08 09:48
Оценка: +2
Здравствуйте, Pretender, Вы писали:

P>Не поленился, снял книгу с верхней полки, цитирую:

Если студент не выполнил ни одного домашнего задания, в процессе пычисления будет сгенерировано исключение.


ИМХО, не надо завязывать такую логику на исключения.
Re[5]: пример из книги: цикл + try/catch
От: skeptik_  
Дата: 13.07.08 12:01
Оценка:
Здравствуйте, oziro, Вы писали:

O>Здравствуйте, Pretender, Вы писали:


P>>Не поленился, снял книгу с верхней полки, цитирую:

Если студент не выполнил ни одного домашнего задания, в процессе пычисления будет сгенерировано исключение.


O>ИМХО, не надо завязывать такую логику на исключения.


В самом деле, штатная ведь ситуация!

PS Исключения ловят не просто по ссылке, а по константной ссылке.
Re[5]: пример из книги: цикл + try/catch
От: Юрий Жмеренецкий ICQ 380412032
Дата: 13.07.08 12:03
Оценка: 1 (1) :))
Здравствуйте, oziro, Вы писали:

O>Здравствуйте, Pretender, Вы писали:


P>>Не поленился, снял книгу с верхней полки, цитирую:

Если студент не выполнил ни одного домашнего задания, в процессе пычисления будет сгенерировано исключение.


O>ИМХО, не надо завязывать такую логику на исключения.


исключение из университета
Re: пример из книги: цикл + try/catch
От: Clevelus Россия http://clevelus.ru
Дата: 13.07.08 14:14
Оценка:
Здравствуйте, varnie, Вы писали:

V>в книге "эффективное программирование на С++" авторов Э. Кёниг и Б. Му есть такой семпл:

V>
V>//...
V>for (vector<Core>::size_type i = 0; i != students.size(); ++i){
V>  cout << students[i].name() << string(maxlen + 1 - students[i].name.size());
V>  try{
V>    double final_grade = students[i].grade;
V>    streamsize prec = cout.presision();
V>    cout << setprecision(3) << final_grade << setprecision(prec) << endl;
V>  } catch(doman_error e){
V>    cout << e.what() << endl;
V>  }
V>}
V>

V>хочу узнать, почему бы не сделать вот так:
V>
V>//...
V>try{
V>  for (vector<Core>::size_type i = 0; i != students.size(); ++i){
V>    cout << students[i].name() << string(maxlen + 1 - students[i].name.size());
V>      double final_grade = students[i].grade;
V>      streamsize prec = cout.presision();
V>      cout << setprecision(3) << final_grade << setprecision(prec) << endl;
V>  }
V>} catch(doman_error &e){
V>    cout << e.what() << endl;
V>}
V>

V>?
V>признателен пояснениям.

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

Вывод: первый пример (из книги) более правильный. (Кстати второй пример более быстрый с точки зрения кода)
Доброго времени суток! Мир Вам! С уважением Clevelus.
Если мой ответ понравился — оцените, ни на что не влияет, но будет приятно.
Re[4]: пример из книги: цикл + try/catch
От: c-smile Канада http://terrainformatica.com
Дата: 13.07.08 19:02
Оценка:
Здравствуйте, Pretender, Вы писали:

P>Здравствуйте, c-smile, Вы писали:


CS>>А где там ошибка может быть? С одним студентом.


P>Не поленился, снял книгу с верхней полки, цитирую:

Если студент не выполнил ни одного домашнего задания, в процессе пычисления будет сгенерировано исключение.


Где?
Re[5]: пример из книги: цикл + try/catch
От: varnie  
Дата: 15.07.08 15:15
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, Pretender, Вы писали:


P>>Здравствуйте, c-smile, Вы писали:


CS>>>А где там ошибка может быть? С одним студентом.


P>>Не поленился, снял книгу с верхней полки, цитирую:

Если студент не выполнил ни одного домашнего задания, в процессе пычисления будет сгенерировано исключение.


CS>Где?


кстати, да, подобной мысли на протяжении этого параграфа в книге не нашел, но по логике с предметом и задачей приведенного примера сходится.
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
Re[6]: пример из книги: цикл + try/catch
От: c-smile Канада http://terrainformatica.com
Дата: 15.07.08 18:41
Оценка:
Здравствуйте, varnie, Вы писали:

CS>>>>А где там ошибка может быть? С одним студентом.


P>>>Не поленился, снял книгу с верхней полки, цитирую:

Если студент не выполнил ни одного домашнего задания, в процессе пычисления будет сгенерировано исключение.


CS>>Где?


V>кстати, да, подобной мысли на протяжении этого параграфа в книге не нашел, но по логике с предметом и задачей приведенного примера сходится.


Что? (сходится)

Где там в теле цикла может генерироваться std::domain_error ?
Re[7]: пример из книги: цикл + try/catch
От: varnie  
Дата: 15.07.08 19:04
Оценка: +1
Здравствуйте, 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));
}

которая и генерирует исключение в случае отсутствия выполненных заданий у студента
"Я женился на первой же женщине, которая обратилась ко мне по мейлу." © Л. Торвальдс
Re[8]: пример из книги: цикл + try/catch
От: c-smile Канада http://terrainformatica.com
Дата: 15.07.08 19:59
Оценка:
Здравствуйте, 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>которая и генерирует исключение в случае отсутствия выполненных заданий у студента

Давай я тебя уже тогда по английски спрошу если уж по русски не полючается понять.

In the code that you've provided:

for (vector<Core>::size_type i = 0; i != students.size(); ++i){
  cout << students[i].name() << string(maxlen + 1 - students[i].name.size());
  try{
    double final_grade = students[i].grade;
    streamsize prec = cout.presision();
    cout << setprecision(3) << final_grade << setprecision(prec) << endl;
  } catch(doman_error e){
    cout << e.what() << endl;
  }
}


what line will generate that std::domain_error?
Beg my pardon by I do not have that Russian book in my possession.

Так вопрос понятнее будет?
Re[9]: пример из книги: цикл + try/catch
От: Pretender  
Дата: 15.07.08 21:21
Оценка:
Здравствуйте, c-smile, Вы писали:

В моей книжке вот эта строчка:

    double final_grade = students[i].grade;


Выглядит так:

    double final_grade = grade(students[i]);


Страница 90, вверху.
Re[10]: пример из книги: цикл + try/catch
От: c-smile Канада http://terrainformatica.com
Дата: 15.07.08 23:11
Оценка: 1 (1)
Здравствуйте, 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, вверху.


Клёво, буду знать.
Re: пример из книги: цикл + try/catch
От: Tilir Россия http://tilir.livejournal.com
Дата: 17.07.08 09:26
Оценка:
Здравствуйте, varnie, Вы писали:

V>в книге "эффективное программирование на С++" авторов Э. Кёниг и Б. Му есть такой семпл:

V>
V>//...
V>for (vector<Core>::size_type i = 0; i != students.size(); ++i){
V>  cout << students[i].name() << string(maxlen + 1 - students[i].name.size());
V>  try{
V>    double final_grade = students[i].grade;
V>    streamsize prec = cout.presision();
V>    cout << setprecision(3) << final_grade << setprecision(prec) << endl;
V>  } catch(doman_error e){
V>    cout << e.what() << endl;
V>  }
V>}
V>


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

for (vector<Core>::size_type i = 0; i != students.size(); ++i){
  cout << students[i].name() << string(maxlen + 1 - students[i].name.size());
  try{
    double final_grade = students[i].grade();
    streamsize prec = cout.presision();
    cout << setprecision(3) << final_grade << setprecision(prec) << endl;
  } catch(const domain_error& e){
    cout << e.what() << endl;
  }
}


Оставим этот косяк на совести Кёнига, может быть он просто забил на секундочку на опасность срезки или решил в учебном примере об этом вообще не запариваться. Давайте я поясню что имел в виду, ловя исключение внутри цикла. У нас есть список студентов. Для каждого нужно либо вывести среднюю оценку, либо строчку что он забил на учёбу Если вы поймаете исключение вне цикла, то если студент #3 забил на учёбу, то до студента #4 очередь просто не дойдёт.

Хочу также добавить что в production-quality code такой оверхед по времени выполнения на ситуацию, не являющуюся исключительной на самом деле (разве есть нечто исключительное в том, чтобы студент забил на занятия?) никто на ревью не пропустит. Так что в качестве домашнего задания можете переписать функцию grade так, чтобы она не кидала лишних исключений и соответственно убрать лишние try/catch из тела цикла.
Re[6]: пример из книги: цикл + try/catch
От: Towiz Украина  
Дата: 17.07.08 15:06
Оценка: 1 (1)
Здравствуйте, skeptik_, Вы писали:

_>PS Исключения ловят не просто по ссылке, а по константной ссылке.


Не факт. Иногда бывает необходимо добавить в исключение какую-то контекстную информацию и пробросить его наверх.
Re[2]: пример из книги: цикл + try/catch
От: Rakafon Украина http://rakafon.blogspot.com/
Дата: 17.07.08 16:16
Оценка:
Здравствуйте, Clevelus, Вы писали:

C>Вывод: первый пример (из книги) более правильный. (Кстати второй пример более быстрый с точки зрения кода)


Про скорость ... не факт: Правда об оверхеде исключений
Автор: gear nuke
Дата: 14.07.08
"Дайте мне возможность выпускать и контролировать деньги в государстве и – мне нет дела до того, кто пишет его законы." (c) Мейер Ансельм Ротшильд , банкир.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.