繁体   English   中英

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

[英]C++ Custom exception throw () in constructor

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

我将此作为我的异常类标题:

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()引用该字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM