gpt4 book ai didi

c++ - 是否可以在 Exception 对象中存储有关错误的信息?

转载 作者:行者123 更新时间:2023-12-01 12:34:43 25 4
gpt4 key购买 nike

我一直在阅读 C++ 中的异常及其优点和缺点,但我还没有遇到任何人提到我真正喜欢它们的两件事:它们允许我扩展错误的定义(扩展到超过只是作为字符串的错误消息),并且它们允许我在异常处理程序和抛出程序之间定义一个契约:

"If I'm going to handle this particular type of error, I'm going to need this, this and that from you."



我没有在任何文章、论坛和博客文章中看到这一点,无论是赞成还是反对。这让我怀疑我对异常的看法以及如何使用它们可能是错误的。

为了澄清,这里有一个我使用异常的例子:

程序与 USB 设备通信(它向设备发送命令并期待它的特定响应)。在响应命令时,此 USB 设备有时会以意想不到的方式运行。在这种情况下,程序将抛出 UnexpectedResponseFromDevice异常(exception)。此异常的处理程序需要的不仅仅是一条错误消息才能完成其工作。例如,它可能需要知道发生错误时我们发送给设备的命令,和/或设备所处的状态。我使用我的 UnexpectedResponseFromDevice 的定义。类以明确规定处理异常所需的内容。请参阅下面的粗略想法。
class UnexpectedResponseFromDevice : public std::exception
{
private:
Command command;
DeviceState deviceState;
std::string msg;

public:
UnexpectedResponseFromDevice(std::string msg, Command command, DeviceState deviceState, ...)
Command getCommand();
DeviceState getDeviceState();
};

这就是我所说的“在异常处理程序和抛出程序之间定义一个契约”的意思。为了抛出异常,需要提供这些东西(在这种情况下是命令、设备状态和消息)。

这是异常的可接受用例吗?我可以将处理异常所需的其他信息存储在异常对象中吗?这是可以接受的,但一个坏主意吗?如果是,请解释原因。

最佳答案

Is this an acceptable use case for exceptions? Is it OK for me to store this other information, that is required for the handling of the exception, in the exception object?


是的,标准库中的异常也是如此。一个例子是 std::system_error 源自 std::runtime_error但添加了 std::error_code 成员携带额外信息。增加更多的是 std::filesystem::filesystem_error 添加两个 std::filesystem::path对象。

Is it acceptable but a bad idea? If so, please explain why.


如果您在抛出异常时冒着抛出另一个异常(如 std::bad_alloc )的风险,或者如果您将异常用作除异常之外的其他东西,例如在程序流中的常见分支之间进行选择,这只是一个坏主意。 throw 最好是罕见的事件。
如果您在 std::string 中拥有所需的所有信息,甚至在类似 std::stack<std::string>> 的东西中, 对象中的成员变量是一个即将 throw你大概可以 std::move将该成员对象放入异常对象以最小化风险 - 如果您在抛出的对象中不再需要该数据。
不知道你的有多大 std::string , CommandDeviceState对象是,但您可能不想通过按值获取参数来构造异常对象。努力 build noexcept . setter/getter 也应该在 const& 之前返回.这不是那么重要 - 但使它们如此可最大程度地降低异常处理程序中出现异常的风险。

关于c++ - 是否可以在 Exception 对象中存储有关错误的信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61312555/

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