gpt4 book ai didi

c++ - 如何正确抛出一个不仅仅需要构造函数的异常?

转载 作者:可可西里 更新时间:2023-11-01 15:46:23 24 4
gpt4 key购买 nike

我有一个 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.

最佳答案

C++ 异常类应该是可复制的或至少是可移动的。在您的示例中,使您的类可复制是添加默认复制构造函数的问题:

Exception(Exception const&) = default;

如果您需要在您的异常类中封装一些不可复制和不可移动的状态,请将此类状态包装到 std::shared_ptr 中。

关于c++ - 如何正确抛出一个不仅仅需要构造函数的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43184192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com