通过Herbert :完整的参考,第10章,异常处理
异常处理为控制具有许多动态运行时特性的复杂程序提供了一种强大的机制。在程序的逻辑中,尝试、抛出和捕获是处理错误和异常边界条件的干净方法,这一点很重要。与使用错误返回代码表示失败的其他语言不同,Java使用异常。因此,当一个方法可能失败时,让它抛出一个异常。这是一种处理故障模式的更干净的方法。最后一点:Java的异常处理语句不应被视为非本地分支的通用机制。如果您这样做,它只会混淆您的代码,并使其难以维护。
他所说的“非局部分支”是什么意思?请在一个很好的例子的帮助下详细说明?
注意,这个问题是在coderanch上提出的,但是那里的答案主要是基于个人的意见,因此它没有给出一个基于根的答案(我无法在那里的讨论中澄清这一点)。
发布于 2014-10-01 06:15:31
下面是一个本地分支的示例:
void foo() {
if (someCondition) {
doSomething();
} else {
doSomethingElse();
}
}分支是相当向前理解的,对吗?这种简单的原因是所有分支逻辑都是在foo中定义的。可以说是本地的。这意味着,将检查一个条件,并根据someCondition选择它的路径,但分支不会转义foo。只看这一种方法,您就知道了代码流可能是什么样的。
现在想想这个不太容易读懂的实现:
void foo() {
if(bar()) {
// branch is handled by bar
} else {
doSomethingElse();
}
}
boolean bar() {
if(somethingWrong) {
return false;
}
doSomething();
}这是不容易读的。但这是为什么?如果从bar调用方法foo,则控制流由bar处理。然而,bar可能会做一些意想不到的事情,并且仍然依赖于foo来处理这种意外的情况。这不是一个好做法,因为您在foo和bar之间分发连接逻辑,其中一个地方的更改可能导致另一个地方的错误行为。这在一定程度上就是当异常在堆栈中被处理得太远时所做的事情。您甚至可以通过添加更多的中间方法来扩展上述示例的复杂性。因此,这本书建议,保持在本地的分支,因为这往往是人类的可读性和可追踪性,我同样认为这是一个好主意。请查看以上代码的基于异常的实现,以便更多地可视化这一点:
void foo() {
try {
bar()
} catch(SomeException e) {
doSomethingElse();
}
}
boolean bar() {
if(somethingWrong) {
throw new SomeException();
}
doSomething();
}显然,这个分布式分支比if-else语句更容易出错.
https://stackoverflow.com/questions/26134896
复制相似问题