return boolean或try catch

A. *_* Go 3 java oop

当函数或方法包含错误/无效数据时,返回false或抛出异常?考虑一个Loginer类有这样的方法:

public boolean login(String username){
    //retrieve data...
    if(username.equals(record.username)){
        return true;
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

然后在主要或其他类

String username = "ggwp";
if(Loginer.login(username)){
    //successful login, show homepage...
    new User(username);
} else {
    //invalid username
}
Run Code Online (Sandbox Code Playgroud)

它不会效率低,因为它已经使用if-else语句两次检查,一次在Loginer中,另一次在main处再次检查为true.不会尝试捕获会做同样的事情吗?让Loginer抛出异常:

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");
}
Run Code Online (Sandbox Code Playgroud)

然后在主要:

String username = "ggwp2";
User theUser;
try{
    //sucessful login
    theUser = Loginer.login(username);
}catch(MyException e){
    //invalid username
}
Run Code Online (Sandbox Code Playgroud)

try-catch不需要第二次检查true或false.(这个例子我使用返回User对象,它可能是void并且只返回,但是为什么使用boolean,最终会被检查两次?)

一些网站消息人士表示不要使用try-catch进行"代码跳转",但在这种情况下它只是做同样的事情.(try-catch与if-else语句太相似)

那么哪个是正确的,为什么?如果这个问题不正确,请指导和抱歉,我是新手OO.

pau*_*sm4 7

简短回答:

永远不应该使用try/catch来实现"控制逻辑".

正如Andy Turner所说,"只使用异常来处理异常情况."

所有支持异常的语言都是如此 - 不仅仅是Java.有用的文章:

例外的最佳做法

PS:try/catch 与"if/else" "相似".它有不同的实现,不同的意图......和它的FAR更加昂贵.

附加说明:

例外:为什么要提前投掷?为什么赶晚了?

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

根据我的经验,最好在发生错误时抛出异常.你这样做是因为它是你最了解触发异常的原因.

当异常展开备份层时,捕获和重新抛出是向异常添加其他上下文的好方法.这可能意味着抛出不同类型的异常,但在执行此操作时包括原始异常.

最终,异常将到达一个层,您可以在该层上对代码流做出决策(例如,提示用户执行操作).这是您应该最终处理异常并继续正常执行的点.

通过对代码库的实践和经验,可以很容易地判断何时向错误添加其他上下文,以及实际上最合理的位置,最终处理错误.

  • Catch→Rethrow

    这样做可以有用地添加更多信息,从而节省开发人员必须通过所有层来理解问题.

  • Catch→Handle

    这样做可以最终决定什么是适当但不同的软件执行流程.

  • Catch→错误返回

    虽然在某些情况下这是合适的,但是应该考虑捕获异常并向调用者返回错误值,以便重构为Catch→Rethrow实现.