【问题标题】:C++ create new exceptions by inheriting from the std::exceptionC++ 通过从 std::exception 继承来创建新的异常
【发布时间】:2014-01-25 20:33:48
【问题描述】:

您好,我有一个 c++ 任务,我需要在其中创建自己的异常。我的异常类必须从 std::exception 继承,其他 2 个类需要从该类派生。我现在拥有它的方式实际上可以编译并且工作得很好。但是当抛出异常时,我得到例如: 在抛出“stack_full_error”的实例后调用终止 what():堆栈已满! 中止(核心转储)

我对这件事感到非常困惑,不幸的是我在网上或我的书中找不到太多帮助。我的标题是这样的:

class stack_error : public std::exception
{
 public:
  virtual const char* what() const throw();
  stack_error(string const& m) throw(); //noexpect;
  ~stack_error() throw();
  string message;
 private:
};

class stack_full_error : public stack_error
{
 public:
  stack_full_error(string const& m) throw();
  ~stack_full_error() throw();
  virtual const char* what() const throw();
};

class stack_empty_error : public stack_error
{
 public:
  stack_empty_error(string const& m) throw();
  ~stack_empty_error() throw();
  virtual const char* what() const throw();
};

我的实现是:

stack_error::stack_error(string const& m) throw()
: exception(), message(m)
{
}

stack_error::~stack_error() throw()
{  
}

const char* stack_error::what() const throw()
{
  return message.c_str();
}

stack_full_error::stack_full_error(string const& m) throw() 
  : stack_error(m)
{   
}

stack_full_error::~stack_full_error() throw()
{

}

const char* stack_full_error::what() const throw()
{
  return message.c_str();
}

stack_empty_error::stack_empty_error(string const& m) throw() 
  : stack_error(m)
{   
}

stack_empty_error::~stack_empty_error() throw()
{

}

const char* stack_empty_error::what() const throw()
{
  return message.c_str();
}

任何帮助将不胜感激!

【问题讨论】:

  • 你发现异常了吗?
  • 您发布的代码看起来大部分都在工作:构造函数都应该删除throw() 规范,因为它们中的每一个实际上可以抛出异常!我也不认为有理由将std::string 设为public 成员,而且仅在基类中覆盖what() 肯定就足够了。你能展示你实际捕获异常的代码吗?
  • Please consider using virtual inheritance 创建自己的异常类型时。此外,如果stack_error 继承自runtime_error 而不是exception,则您将不需要string 成员变量。
  • 非常感谢。看来我忘记改变我的“catch”了,我还在寻找一个 std::out_of_range。

标签: c++ class exception c++11 exception-handling


【解决方案1】:

你需要真正捕捉你的异常:

try
{
    throw stack_full_error("Stack is full!");
} catch(stack_full_error& ex)
{
    std::cout << ex.what();
}

【讨论】:

  • 发明异常的人在我最受尊敬的人名单上并不是很高。为什么不能只有一个返回值来表明发生了什么事?
  • @BWG 这将需要 hacky 返回类型。您可以使用异常提供有关错误的详细信息。此外,您可以捕获 任何 异常,而无需显式检查所有可能的异常。
  • @BWG:返回代码在本地返回错误——异常可以向上移动堆栈。您的算法的核心可能无法处理内存不足的情况,但应用程序的上层可能能够。
  • @BWG:例外是针对特殊情况。返回值用于正常操作。在许多情况下,返回值是合适的,即在处理某些失败状态时,这是您使用接口方式的基本部分。例外情况是您不想立即处理的事情。
  • @BWG 有趣的是,Linux 内核和许多其他 C 代码库使用 goto 进行错误处理,以便跳转到清理代码。这被认为是 C 中的最佳实践,而在 C++ 中,除了例外情况,您的清理工作由本地对象的析构函数自动完成。
猜你喜欢
  • 2011-02-03
  • 2015-02-01
  • 1970-01-01
  • 2010-12-12
  • 2011-12-30
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多