所以我读到你不应该在自定义异常类中拥有除基本类型之外的任何东西,否则它可能会在异常中抛出异常(就像梦中的梦一样)。并且你应该按价值投掷并通过参考抓住。
我将此作为我的异常类标题:
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;
};
。
但是上面的第一段中存在问题,所以我考虑过这样做:
BitPay bitpay = new BitPay();
这样做可以吗?
答案 0 :(得分:1)
使用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()
可以引用的内部字符串。