当函数或方法引发错误/无效数据时,是否返回false或引发异常? 考虑类Loginer具有这样的方法:
public boolean login(String username){
//retrieve data...
if(username.equals(record.username)){
return true;
}
return false;
}
然后在主要班级或其他班级
String username = "ggwp";
if(Loginer.login(username)){
//successful login, show homepage...
new User(username);
} else {
//invalid username
}
这不会是低效率的,因为已经用if-else语句检查了两次,一次在Loginer中,另一次在main处再次检查是否为true。 不会尝试捕获会做同样的事情吗?让登录者抛出异常:
public User login(String username){
//retrieve record data...
if(username.equals(record.username)){
return new User(username);
}
/* Exception if no record found for such username */
throw new MyException("invalid username");
}
然后在主体上
String username = "ggwp2";
User theUser;
try{
//sucessful login
theUser = Loginer.login(username);
}catch(MyException e){
//invalid username
}
try-catch无需再次检查是非。 (本例中我使用return User对象,它可能是空的,什么也没返回,但关键是,为什么要使用boolean最终将被检查两次?)
一些网站消息人士说,不要使用try-catch进行“代码跳转”,但是在这种情况下,它只是做同样的事情。 (try-catch与if-else语句太相似了)
那么哪个是正确的,为什么呢?请指导,如果这个问题不正确,对不起,我是OO的新手。
答案 0 :(得分:6)
简短答案:
您应该从不对“控制逻辑”使用try / catch。
正如安迪·特纳(Andy Turner)所说,“仅使用异常来处理特殊情况。”
对于所有支持例外的语言(不只是Java)同样如此。有用的文章:
PS:尝试/捕获与“如果/其他”“完全相似”。它具有不同的实现方式,不同的意图……而且 FAR 更昂贵。
附加说明:
例外:为什么要提早抛出?为什么要迟到?
以我的经验,最好在 发生错误。您这样做是因为您知道 关于触发异常的原因。
当异常消失后,各层又被捕获并重新抛出 是向异常添加其他上下文的好方法。这个可以 意味着抛出不同类型的异常,但包括原始异常 例外。
最终,异常将到达您可以进行的图层 有关代码流的决定(例如提示用户采取行动)。这是 指出最终应该处理异常并继续的地方 正常执行。
有了您的代码库的实践和经验,它变得非常容易 判断何时向错误中添加其他上下文,以及在什么地方添加更多上下文 明智的做法是最终解决错误。
抓住→重新投掷
执行此操作,可以在其中有用地添加更多信息,以节省时间 开发人员必须通过所有层次来了解 问题。
抓住→处理
执行此操作,您可以最终决定什么是 适当,但整个软件的执行流程不同。
捕获→错误返回
在某些情况下,这很合适 异常并返回错误值给调用者 考虑将其重构为Catch→Rethrow实现。