У меня есть класс Exception, на котором я хочу установить дополнительную информацию, прежде чем я его выброшу. Могу ли я создать объект Exception, вызвать некоторые его функции, а затем выбросить его без каких-либо копий его создания?
Единственный метод, который я нашел, - это бросить указатель на объект:
class Exception : public std::runtime_error
{
public:
Exception(const std::string& msg) : std::runtime_error(msg) {}
void set_line(int line) {line_ = line;}
int get_line() const {return line_;}
private:
int line_ = 0;
};
std::unique_ptr<Exception> e(new Exception("message"));
e->set_line(__LINE__);
throw e;
...
catch (std::unique_ptr<Exception>& e) {...}
Но исключение исключений указателем обычно избегают, так есть ли другой способ?
Существует также возможность установки всех параметров через конструктор, но это может быстро стать нескромным, если к классу добавлено больше полей, и вы хотите иметь мелкомасштабный контроль над тем, какие поля установить:
throw Exception("message"); // or:
throw Exception("message", __LINE__); // or:
throw Exception("message", __FILE__); // or:
throw Exception("message", __LINE__, __FILE__); // etc.