如何在此函数中处理std::bad_alloc
异常:
std::string GetString()
{
std::string str;
return str;
}
由于任何stl构造函数都可以抛出bad_alloc
,我们可以这样做:
std::string GetString()
{
try
{
std::string str;
return str;
}
catch(std::bad_alloc&)
{
return ""; // Constructs temporary std::string and returns. Could throw !
}
}
再次catch
阻止仍然不安全。
我只是想让这个函数异常证明。
答案 0 :(得分:2)
虽然(我认为)标准不能保证,但是大多数(可能是所有)std::string
实现都没有为空/短字符串分配内存(如@BoBTFish所述)。所以你的解决方案是"异常证明",因为它得到。我只是建议,实际返回默认构造的字符串而不是""
。
但是,您应该问自己的基本问题是,bad_alloc
是否是您期望的,因为您可能正在尝试构建一个非常大的字符串,或者如果它实际指示,那么您的系统完全耗尽了内存:
如果分配失败,因为您尝试创建一个包含几百万个字符的字符串,那么构造一个较短/空的错误字符串可能不会引发另一个异常,可以将其视为正确的错误处理形式。
如果它失败了,因为你的程序/系统完全没有内存,你不能在本地处理它(例如你不能释放任何其他内存)因此你也可能不应该试图隐藏那个错误,因为它肯定会不久之后又来了。因此,虽然返回一个空字符串或短字符串可能仍然有效,但我认为没有理由在您的函数中首先捕获该异常。
答案 1 :(得分:1)
尝试遵循本指南:只有处理其根本原因才能捕获异常。抑制异常并不是解决异常暴露的潜在问题。
回答你的问题;关于std :: bad_alloc被抛出的原因,你的函数没有什么可以做的。调用堆栈中的另一个函数可能能够执行某些操作,如果您抑制异常,则无法实现此操作。
答案 2 :(得分:0)
作为一般规则,除非您知道如何处理异常,否则永远不会捕获异常。
此外,由于未捕获异常导致崩溃的程序比尝试解决异常后崩溃的程序更容易调试
在您显示的情况下,如果创建空字符串是bad_alloc
的原因,那么返回""
可能会导致另一个bad_alloc
(隐式创建另一个空字符串)。< / p>
在极少数情况下您可以解析bad_alloc
:例如,如果您知道要缓存大量数据,那么您可以释放缓存的数据并重试分配。
答案 3 :(得分:0)
永远不要捕获与函数实现没有语义相关的异常。否则,你最终会在每个函数中捕获std::exception
,这显然是无稽之谈。
我只是想让这个函数异常证明。
无法创建std::string
并保证不会抛出bad_alloc
。