Поймать несколько пользовательских исключений? - C++

Я - студент в своем первом классе программирования на C++, и я работаю над проектом, где мы должны создать несколько пользовательских классов исключений, и затем в одном из наших обработчиков событий, используйте a try/catch блок для обработки их соответственно.

Мой вопрос: Как я ловлю свои несколько пользовательских исключений в моем try/catch блок? GetMessage() пользовательский метод в моих классах исключений, который возвращает объяснение исключения как a std::string. Ниже я включал все соответствующие нормы из своего проекта.

Спасибо за помощь!

пробуйте/ловите блок


    // This is in one of my event handlers, newEnd is a wxTextCtrl
try {
    first.ValidateData();
    newEndT = first.ComputeEndTime();
    *newEnd << newEndT;
}
catch (// don't know what do to here) {
    wxMessageBox(_(e.GetMessage()), 
                 _("Something Went Wrong!"),
                 wxOK | wxICON_INFORMATION, this);;
}

ValidateData () метод


void Time::ValidateData()
{
    int startHours, startMins, endHours, endMins;

    startHours = startTime / MINUTES_TO_HOURS;
    startMins = startTime % MINUTES_TO_HOURS;
    endHours = endTime / MINUTES_TO_HOURS;
    endMins = endTime % MINUTES_TO_HOURS;

    if (!(startHours <= HOURS_MAX && startHours >= HOURS_MIN))
        throw new HourOutOfRangeException("Beginning Time Hour Out of Range!");
    if (!(endHours <= HOURS_MAX && endHours >= HOURS_MIN))
        throw new HourOutOfRangeException("Ending Time Hour Out of Range!");
    if (!(startMins <= MINUTE_MAX && startMins >= MINUTE_MIN))
        throw new MinuteOutOfRangeException("Starting Time Minute Out of    Range!");
    if (!(endMins <= MINUTE_MAX && endMins >= MINUTE_MIN))
        throw new MinuteOutOfRangeException("Ending Time Minute Out of Range!");
    if(!(timeDifference <= P_MAX && timeDifference >= P_MIN))
        throw new PercentageOutOfRangeException("Percentage Change Out of Range!");
    if (!(startTime < endTime))
        throw new StartEndException("Start Time Cannot Be Less Than End Time!");
}

Только один из моих пользовательских классов исключений, у других есть та же структура как этот


class HourOutOfRangeException
{
public:
        // param constructor
        // initializes message to passed paramater
        // preconditions - param will be a string
        // postconditions - message will be initialized
        // params a string
        // no return type
        HourOutOfRangeException(string pMessage) : message(pMessage) {}
        // GetMessage is getter for var message
        // params none
        // preconditions - none
        // postconditions - none
        // returns string
        string GetMessage() { return message; }
        // destructor
        ~HourOutOfRangeException() {}
private:
        string message;
};
47
задан Alex 25 March 2010 в 03:37
поделиться

3 ответа

Если у вас есть несколько типов исключений и предполагается, что существует иерархия исключений (и все они являются общедоступными из некоторого подкласса std :: exception ],)начните с самого конкретного и продолжайте более общим:

try
{
    // throws something
}
catch ( const MostSpecificException& e )
{
    // handle custom exception
}
catch ( const LessSpecificException& e )
{
    // handle custom exception
}
catch ( const std::exception& e )
{
    // standard exceptions
}
catch ( ... )
{
    // everything else
}

С другой стороны, если вас интересует только сообщение об ошибке - throw то же исключение, скажем std :: runtime_error с разными сообщениями, а затем catch that:

try
{
    // code throws some subclass of std::exception
}
catch ( const std::exception& e )
{
    std::cerr << "ERROR: " << e.what() << std::endl;
}

Также помните - выбросить по значению, поймать по ссылке [const].

61
ответ дан 26 November 2019 в 19:48
поделиться

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

class BaseException { };
class HourOutOfRangeException : public BaseException { };
class MinuteOutOfRangeException : public BaseException { };

Затем вы можете перехватить их все одним уловом block:

catch (const BaseException& e) { }

Если вы хотите иметь возможность вызывать GetMessage , вам необходимо либо:

  • поместить эту логику в BaseException , либо
  • make ] GetMessage виртуальная функция-член в BaseException и переопределить ее в каждом из производных классов исключений.

Вы также можете подумать о том, чтобы ваши исключения были производными от одного из исключений стандартной библиотеки, например std :: runtime_error , и использовать идиоматическую функцию-член what () вместо GetMessage () .

10
ответ дан 26 November 2019 в 19:48
поделиться

Наследуйте все свои исключения из общего базового класса BaseException , который имеет виртуальный метод GetMessage () .

Затем catch (const BaseException & e) .

1
ответ дан 26 November 2019 в 19:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: