假设我的类有一个静态方法,它返回一个类相同类型的对象。例如,要创建对象,此方法必须解析字符串:
class C
{
public:
static C get_obj(const std::string& str)
{
C obj;
// Parse the string and set obj properties
return obj;
}
};
如果,当我解析字符串时,我得到一个错误并且该对象不能被构造为有效对象,我是否要抛出异常或者还有什么?
答案 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变量的风险,这可能会导致很多麻烦