我要抛出异常吗?

时间:2012-07-06 19:20:08

标签: c++ exception

假设我的类有一个静态方法,它返回一个类相同类型的对象。例如,要创建对象,此方法必须解析字符串:

class C
{
public:

   static C get_obj(const std::string& str)
   {
      C obj;
      // Parse the string and set obj properties
      return obj;
   }
};

如果,当我解析字符串时,我得到一个错误并且该对象不能被构造为有效对象,我是否要抛出异常或者还有什么?

4 个答案:

答案 0 :(得分:3)

我会说你应该抛出异常。这样你通知客户端无法获得obj,并迫使他处理这个问题。

如果不重要(不重要),您可以返回一个特殊的C,它将作为哨兵值,表明出现了问题。客户将选择是否对此做些什么。

我会选择例外。不推荐第二种方法。

答案 1 :(得分:3)

鉴于get_obj中存在失败的可能性,必须以某种方式将失败报告给调用者。这通常由

完成
  • 抛出异常
  • 在方法输出中传达失败

在这种特殊情况下,该方法的唯一输出是C实例。鉴于抛出异常可能是此签名方法的最佳选择。唯一的另一种选择是将成功/失败嵌入到C对象中,您几乎肯定不想这样做。

解决此问题的另一种方法是try_parse模式。让bool返回表示成功/失败,并通过引用参数

返回构建的对象成功
bool try_parse(const std::string& str, C& obj) {
  if (string is valid) { 
    obj = C(...);
    return true;
  }

  return false;
}

答案 2 :(得分:0)

是的,抛出异常是完全有效的。 构造一个对象时的原因是相同的,如果你不能继续构造一个你只有很少选择但只能抛出异常的对象。

答案 3 :(得分:-1)

是的,你确实需要抛出异常。

class C
{
public:

   static C get_obj(const std::string& str)
   {
      try
      {
          C obj;
          // Parse the string and set obj properties
          return obj;
      }
      catch (int x)
      {
        cout "blahblah";
      }
   }
};

如果无法构造对象,则冒一个0变量的风险,这可能会导致很多麻烦