当函数或方法包含错误/无效数据时,返回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.
简短回答:
你永远不应该使用try/catch来实现"控制逻辑".
正如Andy Turner所说,"只使用异常来处理异常情况."
所有支持异常的语言都是如此 - 不仅仅是Java.有用的文章:
PS:try/catch 与"if/else" 不 "相似".它有不同的实现,不同的意图......和它的FAR更加昂贵.
附加说明:
例外:为什么要提前投掷?为什么赶晚了?
根据我的经验,最好在发生错误时抛出异常.你这样做是因为它是你最了解触发异常的原因.
当异常展开备份层时,捕获和重新抛出是向异常添加其他上下文的好方法.这可能意味着抛出不同类型的异常,但在执行此操作时包括原始异常.
最终,异常将到达一个层,您可以在该层上对代码流做出决策(例如,提示用户执行操作).这是您应该最终处理异常并继续正常执行的点.
通过对代码库的实践和经验,可以很容易地判断何时向错误添加其他上下文,以及实际上最合理的位置,最终处理错误.
Catch→Rethrow
这样做可以有用地添加更多信息,从而节省开发人员必须通过所有层来理解问题.
Catch→Handle
这样做可以最终决定什么是适当但不同的软件执行流程.
Catch→错误返回
虽然在某些情况下这是合适的,但是应该考虑捕获异常并向调用者返回错误值,以便重构为Catch→Rethrow实现.
| 归档时间: |
|
| 查看次数: |
618 次 |
| 最近记录: |