Shi*_*han 5 java exception-handling
通过Herbert Schildt:完整参考第10章异常处理
异常处理为控制具有许多动态运行时特性的复杂程序提供了强大的机制.将try,throw和catch视为处理程序逻辑中错误和异常边界条件的干净方法非常重要.与使用错误返回代码指示失败的其他语言不同,Java使用异常.因此,当方法失败时,让它抛出异常.这是处理故障模式的更简洁方法.最后一点:Java的异常处理语句不应被视为非本地分支的一般机制.如果这样做,它只会混淆您的代码并使其难以维护.
"非局部分支"一词的含义是什么?在一个很好的例子的帮助下,请详细说明一下?
请注意这个问题是在coderanch上提出的,但那里的答案主要基于个人意见,因此它没有产生基于根的答案(我无法通过那里的讨论澄清这一点).
这是本地分支的示例:
void foo() {
if (someCondition) {
doSomething();
} else {
doSomethingElse();
}
}
Run Code Online (Sandbox Code Playgroud)
分支很容易理解,对吧?这种简单性的原因是所有分支逻辑都在foo. 可以这么说,在本地。这意味着,检查条件并采取其路径取决于someCondition但分支不会逃逸foo。仅通过查看这一种方法,您就知道代码流程可能是什么样子。
现在想想这个可读性较差的实现:
void foo() {
if(bar()) {
// branch is handled by bar
} else {
doSomethingElse();
}
}
boolean bar() {
if(somethingWrong) {
return false;
}
doSomething();
}
Run Code Online (Sandbox Code Playgroud)
这是可读性较差的。但这是为什么呢?bar如果您从调用方法foo,则控制流由 处理bar。bar然而,可能会做一些意想不到的事情,并且仍然依赖于foo处理这种意外情况。这不是一个好的做法,因为您将相互连接的逻辑分布在一起foo,并且bar一个地方的更改可能会导致另一个地方的不当行为。这在某种程度上是异常在堆栈中被处理得太远时所做的事情。您甚至可以通过添加更多中间方法来扩展上述示例的复杂性。因此,这本书建议,保持本地分支,因为这通常更容易被人类阅读和追踪,我同样建议这是一个好主意。查看上述代码的基于异常的实现,以更直观地了解这一点:
void foo() {
try {
bar()
} catch(SomeException e) {
doSomethingElse();
}
}
boolean bar() {
if(somethingWrong) {
throw new SomeException();
}
doSomething();
}
Run Code Online (Sandbox Code Playgroud)
if显然,这种分布式分支比-语句更容易出错else。
| 归档时间: |
|
| 查看次数: |
646 次 |
| 最近记录: |