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
?就个人而言,我不会依赖“错误”名称空间来描述这些类是错误的事实:使用名称空间错误;
很容易使类泛型
看起来非常不清楚,并且违反了命名类型名词的规则。但这只是一种代码风格的东西。