我应该传递什么?

时间:2014-07-08 16:26:47

标签: c++ exception

我在哈希表类中添加了一堆异常来处理可能出现的各种问题。他们大多是这样建造的:

std::string msg = std::string("I made doodoo, some value: ") + std::tostring(value);
throw std::exception(msg.c_str());

一些例外是正常操作的一部分,例如,有一个例子表明表已满,而捕获它的东西则将表重建为更大的表。我发现这对性能造成了相当大的影响,我怀疑它的所有字符串构造。但与此同时,我希望这些例外是有意义的,对于那些不知道我想出的代号是什么意思的人来说是有意义的。什么是解决这个问题的好方法?

1 个答案:

答案 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(...)