// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html
class BadConversion : public std::runtime_error {
public:
BadConversion(std::string const& s)
: std::runtime_error(s)
{ }
};
inline std::string stringify(double x)
{
std::ostringstream o;
if (!(o << x))
throw BadConversion("stringify(double)");
// throw new BadConversion("stringify(double)");
return o.str();
}
[Q1]当我们在函数中抛出异常时,抛出新的ClassName()和抛出ClassName()有什么区别?
[Q2]哪一个更好?
谢谢
答案 0 :(得分:9)
[A1]使用throw new
,您必须catch
指针。在这种情况下,语言没有指定谁负责解除分配,所以你必须建立自己的约定(通常你会让捕手负责)。如果没有new
,您需要catch
作为参考。
[A2]如果你在一个通常会抛出指针的框架中,你可能想要效仿。否则,throw
没有new
。另请参阅C++ FAQ, item 17.14。
答案 1 :(得分:1)
throw new ClassName()
抛出指向ClassName的指针。您需要catch (ClassName * pc)
。这不是个好主意。如果new
返回null或抛出,那么当你捕获或有双重异常时你有空指针。
throw ClassName()
是抛出异常的常用方法。您需要catch (const ClassName & pc)
。
答案 2 :(得分:1)
throw new BadConversion(”xxx“)
正在堆上创建一个新对象并向其投掷指针。 catch块必须删除该对象。我想不出你想要这样做的一个很好的理由。
另一个版本由RAII负责,使用它。
答案 3 :(得分:1)
在您的代码库中,您应该选择一种方法并坚持使用它。
如果你的某些代码抛出指针而其他库抛出对象,那么你的catch子句可能会有点复杂,因为你可能需要捕获指针和相同类型的对象。
我个人更喜欢抛出对象而不是指针(我选择它而不是指针的主要原因是它模仿标准库)。尽管抛出指针是非常可行的,但所有权问题仍然存在。谁(如果有人)负责删除指针?