首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么Java的异常处理语句不应该被视为非本地分支的通用机制?

为什么Java的异常处理语句不应该被视为非本地分支的通用机制?
EN

Stack Overflow用户
提问于 2014-10-01 05:51:02
回答 1查看 1.3K关注 0票数 7

通过Herbert :完整的参考,第10章,异常处理

异常处理为控制具有许多动态运行时特性的复杂程序提供了一种强大的机制。在程序的逻辑中,尝试、抛出和捕获是处理错误和异常边界条件的干净方法,这一点很重要。与使用错误返回代码表示失败的其他语言不同,Java使用异常。因此,当一个方法可能失败时,让它抛出一个异常。这是一种处理故障模式的更干净的方法。最后一点:Java的异常处理语句不应被视为非本地分支的通用机制。如果您这样做,它只会混淆您的代码,并使其难以维护。

他所说的“非局部分支”是什么意思?请在一个很好的例子的帮助下详细说明?

注意,这个问题是在coderanch上提出的,但是那里的答案主要是基于个人的意见,因此它没有给出一个基于根的答案(我无法在那里的讨论中澄清这一点)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-01 06:15:31

下面是一个本地分支的示例:

代码语言:javascript
运行
复制
void foo() {
  if (someCondition) {
    doSomething();
  } else {
    doSomethingElse();
  }
}

分支是相当向前理解的,对吗?这种简单的原因是所有分支逻辑都是在foo中定义的。可以说是本地的。这意味着,将检查一个条件,并根据someCondition选择它的路径,但分支不会转义foo。只看这一种方法,您就知道了代码流可能是什么样的。

现在想想这个不太容易读懂的实现:

代码语言:javascript
运行
复制
void foo() {
  if(bar()) {
    // branch is handled by bar
  } else {
    doSomethingElse();
  }
}

boolean bar() {
  if(somethingWrong) {
    return false;
  }
  doSomething();
}

这是不容易读的。但这是为什么?如果从bar调用方法foo,则控制流由bar处理。然而,bar可能会做一些意想不到的事情,并且仍然依赖于foo来处理这种意外的情况。这不是一个好做法,因为您在foobar之间分发连接逻辑,其中一个地方的更改可能导致另一个地方的错误行为。这在一定程度上就是当异常在堆栈中被处理得太远时所做的事情。您甚至可以通过添加更多的中间方法来扩展上述示例的复杂性。因此,这本书建议,保持在本地的分支,因为这往往是人类的可读性和可追踪性,我同样认为这是一个好主意。请查看以上代码的基于异常的实现,以便更多地可视化这一点:

代码语言:javascript
运行
复制
void foo() {
  try {
    bar()
  } catch(SomeException e) {
    doSomethingElse();
  }
}

boolean bar() {
  if(somethingWrong) {
    throw new SomeException();
  }
  doSomething();
}

显然,这个分布式分支比if-else语句更容易出错.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26134896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档