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