【问题标题】:return boolean or try catch返回布尔值或尝试捕获
【发布时间】:2019-04-14 01:26:01
【问题描述】:

当函数或方法遇到错误/无效数据时,是否返回 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。 不会 try catch 会做同样的事情吗?让登录器抛出异常:

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 不需要第二次检查真假。 (这个例子我使用返回 User 对象,它可能是 void 并且什么都不返回,但重点是,为什么使用 boolean 最终会被检查两次?)

一些网站消息来源说不要使用 try-catch 进行“代码跳转”,但在这种情况下,它只是做同样的事情。 (try-catch 和 if-else 语句太相似了)

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

【问题讨论】:

  • 仅使用异常来处理异常情况。如果可以预测和检测到问题,则无需使用异常。
  • 有返回Optional<User>的选项,只有有效时才填写,否则为空。
  • 是否反对将其作为stackoverflow.com/questions/2972307/… 的副本关闭?

标签: java oop


【解决方案1】:

简答:

您应该绝不将 try/catch 用于“控制逻辑”。

正如 Andy Turner 所说,“仅使用异常来处理异常情况。”

所有支持异常的语言都同样如此——不仅仅是 Java。有用的文章:

Best practices for exceptions

PS:try/catch NOT“只是类似于”“if/else”。它有不同的实现,不同的意图......而且它更昂贵。

补充说明:

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

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

根据我的经验,最好在 发生错误。你这样做是因为你知道 大部分关于触发异常的原因。

当异常展开后层,捕捉和重新抛出 是向异常添加额外上下文的好方法。这个可以 意味着抛出不同类型的异常,但包括原始的 执行此操作时例外。

最终异常会到达你可以制作的层 关于代码流的决策(例如提示用户采取行动)。这是 您应该最终处理异常并继续的点 正常执行。

通过对代码库的实践和经验,它变得非常容易 判断何时向错误添加额外的上下文,以及最常见的位置 明智的做法是,最终处理错误。

  • 捕捉→重新抛出

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

  • 捕捉→处理

    这样做可以让您最终决定什么是 合适,但通过软件的执行流程不同。

  • Catch → 错误返回

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

【讨论】:

  • “PS”表示这应该是一条评论(所以我不会投反对票,等你删除它;-))
  • 是的,它本来是一个评论。但是回复并没有完全“删除”,所以我会把它作为回复......而只是删除我之前的评论。顺便说一句 - 这篇文章有重复,包括:Best practice for Java exception handlingExceptions: Why throw early? Why catch late?
  • 虽然成本要高得多,但一旦这条路径预热,它会花费大约 1 微秒,而布尔值只是其中的一小部分,但可能不是问题。
  • 最后的评论:虽然可以很好地抛出“登录异常”错误,但我只使用布尔值。原因是调用登录的调用者需要直接知道它是否成功,并采取适当的行动。没有必要将登录失败“冒泡”到代码的任何其他部分。
猜你喜欢
  • 2016-05-02
  • 2015-10-05
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多