0

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

class C
{
public:

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

如果在解析字符串时出现错误并且无法将对象构造为有效对象,我是否应该抛出异常或其他什么?

4

4 回答 4

3

我会说你应该抛出一个异常。这样你通知客户端无法获取 obj,并强制他处理。

如果不重要(不重要),您可以返回一个特殊C值,该值将充当指示出现问题的标记值。客户将选择是否对其进行处理。

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

于 2012-07-06T19:23:44.613 回答
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;
}
于 2012-07-06T19:26:15.827 回答
0

是的,抛出异常是完全有效的。与构造对象时的相同原因,如果您无法继续构造对象,您别无选择,只能抛出异常。

于 2012-07-06T19:22:16.810 回答
-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 变量的风险,这可能会进一步导致很多麻烦

于 2012-07-06T19:22:03.780 回答