Выдача ошибки в main из функции, вызванной другой функцией

0

Скажем, у меня есть функция (mnHw), которая вычисляет среднее значение вектора (вектор домашней работы). Эта функция вызывает domain_error("Student did no homework") когда вектор пуст. Когда я вызываю mnHw из main, все просто, когда я хочу распечатать ошибку:

        try
        {
            cout  <<  mnHw(student.homework);
        }
        catch (domain_error e)
        {
            cout << e.what();
        }

Тем не менее, все сложно, если я хочу только сохранить средний класс домашней работы, а не вектор всех классов, для ученика. В этом случае я вызываю mnHw внутри функции, которая читает в информации о студенте (readStudent), и выдает флаг (-1), когда домашняя работа не вводится:

        try
        {
            student.finalGrade=mnHw(hwGrades);
        }
        catch (domain_error e)
        {
            student.finalGrade = -1;
        }

Затем, в main, я могу сделать следующее, чтобы восстановить ошибку:

    if (allStudents[i].finalGrade == -1) 
        cout << "Student did no homework";
    else  
        cout << allStudents[i].finalGrade;

Интуитивно, однако, этот метод флага кажется менее изящным, чем передача фактического сообщения об ошибке непосредственно в основное, по крайней мере для тех случаев, когда я хочу отображать его из основного (что здесь и происходит). Есть ли какой - то трюк или технику, мне не хватает, что бы сразу дать main доступ к e.what() из mnHw?

Что такое хорошая практика?

Примечание. У меня есть все функции для каждого из этих случаев, которые я мог бы опубликовать, но они казались слишком длинными. Пожалуйста, дайте мне знать, если бы я включил их, чтобы я стал более ясным. Также, пожалуйста, не стесняйтесь исправить любые другие ошибки, которые я делаю. Я только сейчас изучаю C++ правильный путь и хочу, чтобы исправлялось как можно больше. <flame-retardant vest>

  • 2
    «этот метод флага кажется менее элегантным, чем передача сообщения об ошибке непосредственно в main» - не совсем. Лично я ненавижу функции, которые должны выполнять вычисления, но они печатают в stdout / stderr. Это вредит моему чувству равновесия. : P Если функция выполняет вычисления, то пусть она выполняет свою задачу, а затем возвращает либо действительное значение, либо значение вне допустимого диапазона, чтобы сигнализировать об ошибке. Затем его пользователь / клиент / вызывающий объект (думайте о вашем коде, как будто он будет библиотекой!) Может делать все, что захочет, при обнаружении ошибки.
  • 1
    Почему бы не позволить вашей функции бросить исключение и сделать main ?
Показать ещё 1 комментарий
Теги:
exception-handling
try-catch

1 ответ

1

Вы можете повторно выбрасывать исключение (const domain_error* e){ throw e;}. Или лучше, вы можете создать на основе domain_error создать другое исключение, т.е. student_final_grade_exception и выбросить его.

РЕДАКТИРОВАТЬ:

Что-то вроде:

 try
        {
            student.finalGrade=mnHw(hwGrades);
        }
        catch (domain_error& e)
        {
              student_final_grade_exception mean_excep;
              mean_excep.addInfo("Error in calculation means...");
              mean_excep.addInfo(e.what()); 
              throw mean_excep;
        }

И затем, вы подготовите свой main чтобы поймать student_final_grade_exception. Конечно, для создания нового типа исключений существует более небольшая работа, но она позволяет получить дополнительную информацию и позволить функциям только то, что они предполагают делать, как было сказано.

  • 0
    Спасибо, я попробую это. Любые рекомендации для хороших источников с быстрым объяснением того, как сделать новый тип исключения?
  • 1
    @neuronet Посмотрите здесь . Раньше я унаследовал от std::exception , но мне кажется, что он лучше для std::runtime_error или std::logic_error .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню