我在哈希表类中添加了一堆异常来处理可能出现的各种问题。他们大多是这样建造的:
std::string msg = std::string("I made doodoo, some value: ") + std::tostring(value);
throw std::exception(msg.c_str());
一些例外是正常操作的一部分,例如,有一个例子表明表已满,而捕获它的东西则将表重建为更大的表。我发现这对性能造成了相当大的影响,我怀疑它的所有字符串构造。但与此同时,我希望这些例外是有意义的,对于那些不知道我想出的代号是什么意思的人来说是有意义的。什么是解决这个问题的好方法?
答案 0 :(得分:1)
理想情况下,您应该从std::exception
创建自定义异常类。这样,当您创建catch
块时,您可以为每个例外设置一个特定的catch
。例如:
class MyException; // Inherits from std::exception.
class MyOtherException; // Inherits from std::exception.
void foo()
{
if (bar)
throw MyException();
if (baz)
throw MyOtherException();
// do stuff.
}
int main()
{
try
{
foo();
}
catch(const MyException &ex)
{
// Handle MyException.
}
catch (const MyOtherException &ex)
{
// Handle MyOtherException.
}
}
创建自己的异常类可以提供更大的灵活性,因为它允许您将附加信息附加到异常,以及处理如上所述的不同异常类型。
class MyException : public std::exception
{
private:
std::string m_description;
int m_userId;
public:
MyException(const std::string &errorDescription = "Unhandled exception", const int userId) :
m_description(errorDescription),
m_userId(userId)
{
}
int get_user_id() const
{
return m_userId;
}
virtual const char *what() const
{
return m_description.c_str();
}
}
您的代码的主要问题(至少您如何描述它)然而,您似乎正在控制您的程序流程中的异常。异常并非设计为快速构造,它们是针对特殊情况设计的,如果不处理,会导致程序崩溃。尝试使用异常代替if语句会使代码变得非常慢,很难阅读,甚至更难理解/维护。
从您的示例中获取:如果您要添加到哈希表,并且需要调整表的大小,为什么还需要抛出异常,只需调整大小 ?这正是std::vector
的工作原理。如果您在push_back()
和vector
上执行vector.capacity() < vector.size() + 1
,则向量将在内部重新分配缓冲区,以便可以添加新项目。可能抛出异常的唯一情况是内存不足。来电者不知道其中任何一项,只需拨打vector.push_back(...)
。