C++ 通过异常处理错误

C++ 通过异常处理错误,c++,C++,我正在清理代码,并通过异常切换到错误处理(因为这将在某些地方显著缩短代码) 这意味着我需要设计自己的异常类层次结构 现在看起来是这样的: namespace error { /** Generic error */ class generic : public std::except { public: generic(const std::string& s) : std::except(s) {} }; /** Namespa

我正在清理代码,并通过异常切换到错误处理(因为这将在某些地方显著缩短代码)

这意味着我需要设计自己的异常类层次结构

现在看起来是这样的:

  namespace error
  {
  /** Generic error */
  class generic : public std::except
    {
    public:
      generic(const std::string& s) : std::except(s) {}
    };

  /** Namespace for network related errors */
  namespace network
    {
    /** Generic network error */
    class generic : public ::error::generic
      {
      public:
        generic(const std::string& s) : ::error::generic(s) {}
      };

    /** Network timeout */
    class timeout : public ::error::network::generic
      {
      public:
        timeout(const std::string& s) : ::error::network::generic(s) {}
      };
    }
  }

问题是这看起来不是特别可读。在处理异常类的层次结构时,是否有一些首选的样式?

当类名不能描述它将拥有的角色时,这肯定表明该类不应该存在。您有两个名为
generic
的类。他们的目的是什么

实际上,您只引入了一种异常类型,
timeout
。我将把你给出的改写为:

namespace error
{
  namespace network
  {
     class timeout : public std::exception 
     {
       public:
         timeout(const std::string& s);
         const char* what();
     }
  }
}

我觉得这个不错。如果我是你,我会简单地删除
::error
::error::network
,因为在这些情况下它们是不必要的(如果我没有误读的话),我同意@KirilKirov所说的,但我也不认为
泛型
类有什么理由。你可能是指
std::exception
,除了
,它没有
,它有一些您需要实现的纯虚拟成员函数。确保您的异常对象符合它需要的异常保证(特别是,复制不应引发异常。出现
generic
错误和
generic
网络异常似乎有点不对劲……到底是哪一个?
error::generic
还是
error::network::generic
?就个人而言,我不会依赖“错误”名称空间来描述这些类是错误的事实:
使用名称空间错误;
很容易使类
泛型
看起来非常不清楚,并且违反了命名类型名词的规则。但这只是一种代码风格的东西。