Кратко:
При проектировании пользовательского класса исключений в 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с последующим выводом сообщения об ошибке.