Кратко:

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