返回布尔值或尝试catch

时间:2018-11-10 20:51:14

标签: java oop

当函数或方法引发错误/无效数据时,是否返回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的新手。

1 个答案:

答案 0 :(得分:6)

简短答案:

您应该从不对“控制逻辑”使用try / catch。

正如安迪·特纳(Andy Turner)所说,“仅使用异常来处理特殊情况。”

对于所有支持例外的语言(不只是Java)同样如此。有用的文章:

Best practices for exceptions

PS:尝试/捕获与“如果/其他”“完全相似”。它具有不同的实现方式,不同的意图……而且 FAR 更昂贵。

附加说明:

  

例外:为什么要提早抛出?为什么要迟到?

     

https://softwareengineering.stackexchange.com/questions/231057/exceptions-why-throw-early-why-catch-late

     

以我的经验,最好在   发生错误。您这样做是因为您知道   关于触发异常的原因。

     

当异常消失后,各层又被捕获并重新抛出   是向异常添加其他上下文的好方法。这个可以   意味着抛出不同类型的异常,但包括原始异常   例外。

     

最终,异常将到达您可以进行的图层   有关代码流的决定(例如提示用户采取行动)。这是   指出最终应该处理异常并继续的地方   正常执行。

     

有了您的代码库的实践和经验,它变得非常容易   判断何时向错误中添加其他上下文,以及在什么地方添加更多上下文   明智的做法是最终解决错误。

     
      
  • 抓住→重新投掷

         

    执行此操作,可以在其中有用地添加更多信息,以节省时间   开发人员必须通过所有层次来了解   问题。

  •   
  • 抓住→处理

         

    执行此操作,您可以最终决定什么是   适当,但整个软件的执行流程不同。

  •   
  • 捕获→错误返回

         

    在某些情况下,这很合适   异常并返回错误值给调用者   考虑将其重构为Catch→Rethrow实现。

  •   
相关问题