gpt4 book ai didi

c++ - 我应该传递什么来抛出?

转载 作者:太空宇宙 更新时间:2023-11-04 11:31:27 25 4
gpt4 key购买 nike

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

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

一些异常是正常操作的一部分,例如,有一个异常表明表已满,捕获它的东西然后将表重建为一个更大的表。我发现这对性能造成了相当大的影响,我怀疑它是所有的字符串结构。但与此同时,我希望异常(exception)是有意义的,并且对那些不知道我提出的代码数字是什么意思的人有意义。有什么好的方法来处理这个问题?

最佳答案

理想情况下,您应该从 std::exception 创建自定义异常类.这样当你创建你的 catch 时 block ,你可以有一个特定的 catch对于您的每个异常(exception)。示例:

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.
}
}

创建您自己的异常类可为您提供更大的灵 active ,因为它允许您将附加信息附加到您的异常,以及如上所述处理不同的异常类型。

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();
}
}

然而,您的代码的主要问题(至少您是如何描述的)是您似乎在控制您的程序流程,但没有异常(exception)。异常不是为快速构造而设计的,它们是为特殊情况而设计的,如果不处理,将导致程序崩溃。尝试使用异常代替 if 语句会使您的代码变得非常缓慢、难以阅读,甚至更难理解/维护。

以您的示例为例:如果您要添加到哈希表,并且需要调整表的大小,为什么您需要抛出异常,而您可以调整它的大小?这正是 std::vector 的方式作品。如果你做 push_back()vector 上和 vector.capacity() < vector.size() + 1 , vector 将在内部重新分配缓冲区,以便可以添加新项目。唯一可能抛出异常的情况是内存不足。调用者不知道这些,它只是调用 vector.push_back(...) .

关于c++ - 我应该传递什么来抛出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24636983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com