У меня есть класс 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.
e
в качестве указателя. В ваших 4 примерах бросков используются параметры по умолчанию, поэтому вам нужно определить только 1 конструктор. - person Richard Critten   schedule 03.04.2017