std :: exception: использование виртуальной функции и наследования против переменной - PullRequest
0 голосов
/ 27 июня 2018

По какой причине std::exception спроектирован таким образом, что для создания нового типа исключения создается производный класс, который переопределяет функцию virtual what(), чем создает класс, который может содержать строку и возвращать ее на what()?

class exception
{
    std::string msg;
public:
    exception(std::string _msg) : msg(_msg) {}
    void set(std::string _msg) { msg = _msg; }
    std:string what() { return msg; }
};

И каждая ошибка (bad_alloc, logical_error ...) может быть экземпляром класса, а не производным классом.

В чем причина использования виртуальных функций и наследования, а не вышеуказанного подхода?

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

блок catch не может быть шаблоном, что означает, что должен быть указан тип, в который исключение неявно конвертируется.

наличие одного интерфейса для исключения (std::exception) позволяет перехватить любое исключение и получить там сообщение об ошибке, не зная или не заботясь о реальном типе исключения. но также позволяйте пользователю выбирать более точный тип, например std::runtime_error, если он хочет перехватывать только эти исключения.

0 голосов
/ 27 июня 2018

Оба могут быть использованы и прекрасно. Стандартная библиотека использует этот подход для создания различных «категорий» исключений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...