Кратко:
При проектировании пользовательского класса исключений в C++ важно учитывать несколько ключевых аспектов, таких как наследование от базового класса std::exception
, определение конструкторов и методов, обеспечение информативности исключений.
Наследование От std::exception
- Все пользовательские классы исключений в C++ должны наследовать от базового класса
std::exception
. Это обеспечивает стандартную обработку исключений в системе и позволяет использовать полезные методы, такие какwhat()
для возврата сообщения об ошибке.
Конструкторы и методы
- Конструкторы: Рекомендуется определять конструкторы с параметрами для передачи дополнительной информации о возникшей ошибке.
- Метод
what()
: Переопределение методаwhat()
для возврата строкового описания ошибки. Это позволяет легко определять причины исключения при его обработке.
Информативность исключений
- Исключения должны быть информативными и содержательными. Они должны ясно указывать на причину ошибки или нештатной ситуации, чтобы облегчить их диагностику и исправление.
Пример пользовательского класса исключений
#include <iostream>
#include <exception>
class FileException : public std::exception {
public:
explicit FileException(const std::string& message) : msg(message) {}
const char* what() const noexcept override {
return msg.c_str();
}
private:
std::string msg;
};
void processFile(const std::string& filename) {
// Simulating a file operation that may throw a custom exception
throw FileException("Error: Unable to process file '" + filename + "'");
}
int main() {
try {
processFile("example.txt");
} catch (const FileException& e) {
std::cerr << "FileException caught: " << e.what() << std::endl;
} catch (const std::exception& e) {
std::cerr << "Exception caught: " << e.what() << std::endl;
}
return 0;
}
В этом примере:
FileException
наследуется отstd::exception
и переопределяет методwhat()
, чтобы возвращать сообщение об ошибке.- Функция
processFile
выбрасывает исключениеFileException
с детализированным сообщением об ошибке при попытке обработать файл. - В блоке
catch
осуществляется перехват исключенияFileException
с последующим выводом сообщения об ошибке.