Я - студент в своем первом классе программирования на 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;
};
Если у вас есть несколько типов исключений и предполагается, что существует иерархия исключений (и все они являются общедоступными из некоторого подкласса 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].
Вы должны создать базовый класс исключений, и все ваши конкретные исключения будут производными от него:
class BaseException { };
class HourOutOfRangeException : public BaseException { };
class MinuteOutOfRangeException : public BaseException { };
Затем вы можете перехватить их все одним уловом block:
catch (const BaseException& e) { }
Если вы хотите иметь возможность вызывать GetMessage
, вам необходимо либо:
BaseException
, либо ] GetMessage
виртуальная функция-член в BaseException
и переопределить ее в каждом из производных классов исключений. Вы также можете подумать о том, чтобы ваши исключения были производными от одного из исключений стандартной библиотеки, например std :: runtime_error
, и использовать идиоматическую функцию-член what ()
вместо GetMessage ()
.
Наследуйте все свои исключения из общего базового класса BaseException
, который имеет виртуальный метод GetMessage ()
.
Затем catch (const BaseException & e)
.