我有没有抛出一个例外

Have I to throw an exception?

本文关键字:一个 有没有      更新时间:2023-10-16

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

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

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

鉴于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;
}

我会说你应该抛出一个异常。通过这种方式,您可以通知客户无法获得 obj,并迫使他处理此问题。

如果不重要(不重要),您可以返回一个特殊C,该将充当指示出现问题的哨兵值。客户将选择是否对此执行某些操作。

我会例外。不建议使用第二种方法。

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

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

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 变量的风险,这可能会进一步造成很多麻烦

相关文章: