gpt4 book ai didi

C++ 构造函数中的自定义异常 throw()

转载 作者:太空狗 更新时间:2023-10-29 22:57:37 25 4
gpt4 key购买 nike

所以我读到你不应该在自定义异常类中有除基本类型之外的任何东西,否则它可能会在异常中抛出异常(就像梦中梦)。而且你应该按值(value)抛出并按引用捕获。

我有这个作为我的异常类头:

class DeepthroatException : public std::runtime_error {
public:
DeepthroatException(const char* err); // set err member to err

private:
// Error description
const char* err;
};

但我不喜欢它,因为它引入了内存管理问题,肉眼看不到,我需要使用地雷探测器。如果可能,我想更改为 std::string

但是接着就是上面第一段的问题,于是想到了这样做:

#include <string>
class DeepthroatException : public std::runtime_error {
public:
DeepthroatException(std::string err) throw(); // set err member to err, no throw

private:
// Error description
std::string err;
};

这样可以吗?

最佳答案

使用 std::string 也会让您在使用 std::bad_alloc 时遇到麻烦。但是这个问题已经是 std::runtime_error 固有的,因为它的构造函数可以将 std::string 作为参数:

explicit runtime_error( const std::string& what_arg );
explicit runtime_error( const char* what_arg );

只有这样,因为复制异常永远不会抛出,所以实现可能会分配另一个字符串并将参数的内容复制到它。如果您真的不想抛出第二个异常,请将您的构造函数标记为 noexcept 并确保它永远不会失败,如果失败,您的程序将立即关闭。

您可以继承 std::runtime_error 行为,只需使用构造函数中的字符串构造它,如下所示:

DeepthroatException(const std::string& err) noexcept :
std::runtime_error(err)
{
// ...
}

此时,您可以删除err 数据成员,因为runtime_error 将为您提供内部字符串,您可以通过what().

关于C++ 构造函数中的自定义异常 throw(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43410767/

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