【发布时间】:2011-07-19 16:17:13
【问题描述】:
我认为作为 Java(可能还有任何具有异常处理的语言)的一般规则,人们应该尽量避免使用异常处理来实际处理业务逻辑,这是公认的。一般来说,如果预期某种情况应该发生,应该检查它并更直接地处理它,而不是依靠异常处理来为你做检查。例如,以下不被认为是好的做法:
try{
_map.put(myKey, myValue);
} catch(NullPointerException e){
_map = new HashMap<String, String>();
}
应该像这样完成延迟初始化:
if(_map == null){
_map = new HashMap<String, String>();
}
_map.put(myKey, myValue);
当然,可能存在比简单地处理延迟初始化更复杂的逻辑。因此,鉴于这种类型的事情通常不受欢迎......如果有的话,依赖发生的异常来发生某些业务逻辑是一个好主意吗?是否可以准确地说,任何一个人觉得不得不使用这种方法的实例确实突出了所使用的 API 的弱点?
【问题讨论】:
-
这个“一般”规则有例外。在异常实现非常差的语言中(例如在 Java 中),除了简单的错误处理之外,将它们用于任何其他事情确实不是一个好主意。但是在像 OCaml 这样的语言中,将异常用于控制流是完全可以的,因为它们非常便宜且高效。
-
这让我想到了 Python 的迭代器。他们依靠
StopException来停止迭代。对this answer 的评论暗示了 Python 哲学“请求宽恕比请求许可更容易”。 -
所以听起来哲学比我意识到的更多地依赖于语言......有趣......
标签: java exception-handling coding-style