更新后记

This commit is contained in:
sjsdfg
2019-05-23 16:38:44 +08:00
parent 77554cef89
commit 488f29214d

View File

@@ -2172,9 +2172,40 @@ WrapCheckedException.throwRuntimeException() 的代码可以生成不同类型
## 后记Exception Bizarro World
(来自于 2011 年的一篇博文)
我的朋友James Ward正在尝试使用JDBC创建一些非常简单的教学示例并且不断被检查的异常所挫败。他向我指出 Howard Lewis Ship 的帖子“[被检查的例外的悲剧](http://tapestryjava.blogspot.com/2011/05/tragedy-of-checked-exceptions.html)”。特别是。James 对他必须跳过去做一些应该简单的事情的所有环感到沮丧。即使在finally块中他也不得不放入更多的try-catch子句因为关闭连接也会导致异常。它在哪里结束为了简单起见你必须在环之后跳过环请注意try-with-resources语句可以显着改善这种情况
我们开始讨论Go编程语言我很着迷因为Rob Pike等人。我们已经清楚地提出了许多关于语言设计的非常尖锐和基本的问题。基本上他们已经采取了我们开始接受的有关语言的所有内容并询问“为什么”关于每一种语言。学习这门语言真的让你思考和怀疑。
我的印象是Go团队决定不做任何假设只有在明确需要特征的情况下才能改进语言。他们似乎并不担心进行破坏旧代码的更改 - 他们创建了一个重写工具因此如果他们进行了这些更改它将为您重写代码。这使他们能够使语言成为一个持续的实验以发现真正需要的东西而不是做Big Upfront Design。
他们做出的最有趣的决定之一是完全排除异常。你没有看错 —— 他们不只是遗漏了经过检查的异常情况。他们遗漏了所有异常情况。
替代方案非常简单起初它几乎看起来像C一样。因为Go从一开始就包含了元组所以你可以轻松地从函数调用中返回两个对象
```go
result, err := functionCall()
```
:= 告诉 Go 语言这里定义 result 和 err并且推断他们的数据类型
就是这样:对于每次调用,您都会获得结果对象和错误对象。您可以立即检查错误(这是典型的,因为如果某些操作失败,则不太可能继续下一步),或者稍后检查是否有效。
起初这似乎很原始是古代的回归。但到目前为止我发现Go中的决定都得到了很好的考虑值得深思。我只是做出反应因为我的大脑是异常的吗这会如何影响 James 的问题?
它发生在我身上我已经将异常处理视为一种并行执行路径。如果你遇到异常你会跳出正常的路径进入这个并行执行路径这是一种“奇异世界”你不再做你写的东西而是跳进catch和finally子句。正是这种替代执行路径的世界导致了 James 抱怨的问题。
James 创造了一个对象。理想的情况下。对象创建不会导致潜在的异常因此你必须抓住它们。你必须通过try-finally跟踪创建以确保清理发生Python团队意识到清理不是一个特殊的条件而是一个单独的问题所以他们创建了一个不同的语言构造 - 以便停止混淆二。任何导致异常的调用都会停止正常的执行路径并跳转通过并行bizarro-world到 catch 子句。
关于异常的一个基本假设是,我们通过在块结束时收集所有错误处理代码而不是在它们发生时处理错误来获益。在这两种情况下,我们都会停止正常执行,但是异常处理有一个自动机制,它会将你从正常的执行路径中抛出,跳转到你的并行异常世界,然后在正确的处理程序中再次弹出你。
跳入奇异的世界会给 James 带来问题它为所有程序员增加了更多的工作因为你无法知道什么时候会发生什么事你可以随时进入奇怪的世界你必须添加一些try块来确保没有任何东西从裂缝中滑落。您最终必须进行额外的编程以补偿异常机制它似乎类似于补偿共享内存并发所需的额外工作
Go团队采取了大胆的举动质疑所有这些并说“让我们毫无例外地尝试它看看会发生什么。”是的这意味着你通常会在发生错误的地方处理错误而不是最后将它们聚集在一起尝试块。但这也意味着关于一件事的代码是本地化的也许这并不是那么糟糕。这也可能意味着您无法轻松组合常见的错误处理代码除非您确定了常用代码并将其放入函数中也不是那么糟糕。但这绝对意味着您不必担心有多个可能的执行路径而且所有这些都需要。
<!-- 分页 -->
<div style="page-break-after: always;"></div>
```
```