C ++ - “抛出新的BadConversion(”xxx“)”和“抛出BadConversion(”xxx“)之间的区别”

时间:2010-12-20 20:09:14

标签: c++ exception exception-handling

// 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]哪一个更好?

谢谢

4 个答案:

答案 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子句可能会有点复杂,因为你可能需要捕获指针和相同类型的对象。

我个人更喜欢抛出对象而不是指针(我选择它而不是指针的主要原因是它模仿标准库)。尽管抛出指针是非常可行的,但所有权问题仍然存在。谁(如果有人)负责删除指针?