Java设计出checked exception有必要吗( 四 )


如果真的以后什么东西要利用checked exception列表来除错的话,C#的话借助.net + 反射 + roslyn都可以轻松搞定。Java作为年纪更大的语言肯定更容易。

■网友
深夜答一发。关于错误处理机制这个问题,有一篇文章非常值得一读,裂墙推荐:
Joe Duffy - The Error Model我翻译了一下,长文警告:
dontpanic:错误模型 - The Error Model=========
太长不看版:
1、异常本就应该是函数签名的一部分,就像函数的返回类型一样。
2、Java 的异常并不全是 Checked Exception,RuntimeException 并不是 Checked。
3、异常不应该被用来传递程序逻辑的 Bug,比如空指针解引用。
4、在一个函数的调用处,并没有显式地说明某个函数调用是否会抛出异常。大部分情况下都是一个try 包住很多可能发生异常的函数调用,处理方式太过于粗粒度,也不利于 Code Review。
5、Java 并没有鼓励“单一失败模式”(即 throws Exception)。有些时候,多失败模式是有必要的,但多数情况下,程序的恢复处理逻辑与具体发生了什么错误无关(即只需要直知道成功与否即可)。当与具体发生的错误有关时,作者推荐使用 “The Keeper Pattern”。
6、相比于 Checked Exception,Unchecked Exception 可靠性更低,它需要以文档的方式说明一个函数可能会抛出什么异常,对程序员、IDE、编译器都不友好。但正如 Andrew 在一篇采访 The Trouble with Checked Exceptions 中所说,在某些时候(比如应用开发),大多数人并不关心如何处理异常,他们只关心当异常发生时我要处理好后事(C# 的 using),剩下的事就交给最上层的 catch 去做好了。这是大家喜欢 Unchecked Exception 的原因。
7、Rust 赛高!

最后还是推荐看一下原文,作者总结了非常多的东西,还给出了他们自己语言中的错误处理模型。

■网友
首先要明白Exception是什么。exception是一个概念,表示程序运行过程中的exceptional condition。当你catch它时,你是在声明you are expecting such conditions and you know how to deal with them. 主要目的是让一个api声明它可能会产生的特殊情况,明确告知该api的调用者。然后是 checked exception VS unchecked exception。checked exception一旦在函数上声明了,意思就是:“我已经告诉你我可能会产生的特殊情况了。怎样处理是你的(client code)责任,如果处理失当,你要负全责。如果你有能力处理,或者可能知道为什么会出现这种情况,或者有对应这种特殊情况的default/optional route,那么你可以处理。如果不能,则请继续让它bubble up告知你自己的调用者,而它可能知道些什么。但是如果更上一级的调用者is not supposed to understand 这个exception的语义的话, 则在catch里rethrow, 把你接到的exception包起来,重新抛出一个上级调用者知道是什么意思的exception”unchecked exception 则基本是协助client code改bug的(You do not catch it. You fix it!)。这种exception与checked exception不同,它是不告知client code自己的存在的, 会不断 bubble up直到framework的default handler. 其存在的其中一个目的是:让你在代码测试时尽量让这种unchecked exception 蹦出来。它的出现表明your client code is not using the api correctly. Here\u0026#39;s some stack trace. Go fix it already! 比如NullPointerException不是让你去catch,而是提示你去修改client code以解决该问题,比如去check null 或者用 Null Object Pattern。carcassi: Simple guide to checked exceptions Blog
■网友
checked exception的设计当然有意义,这是一个非常强的合约(contract),现在很多程序员还是信奉desigh by contract的思路,觉得checked exception是可以有效提高软件质量和项目可维护性的。但尽管如此,现在更多程序员倾向认为这种设计弊大于利。


推荐阅读