summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreltrac <hi@eltr.ac>2026-08-05 13:39:05 +0800
committereltrac <hi@eltr.ac>2026-08-05 13:39:05 +0800
commitb3abd55e87da7d0a4d6de7e49223fc3d784e0e7e (patch)
treeb0ab7acd64ca09a76d99eaa9ee2df6c6d47611b7
parent63d5ac76922bc65bfac53e1f60e62707988c5041 (diff)
[draft] update
-rw-r--r--content/article/banality-of-go-err.md25
1 files changed, 21 insertions, 4 deletions
diff --git a/content/article/banality-of-go-err.md b/content/article/banality-of-go-err.md
index f58efa66..1bded6a6 100644
--- a/content/article/banality-of-go-err.md
+++ b/content/article/banality-of-go-err.md
@@ -1,12 +1,15 @@
+++
-title = '误之平庸'
-subtitle = 'The Banality of Go Error'
-slug = ''
+title = '艾尔特拉克在岣琅'
+subtitle = 'A Report on the Banality of Go Error'
+slug = 'banality-of-go-err'
tags = []
categories = '代码炼金术'
date = 2026-08-04T13:26:47+08:00
draft = true
toc = true
+endnotes = [
+ "标题是对阿伦特作品的[捏他](https://zh.moegirl.org.cn/%E6%8D%8F%E4%BB%96),具体的作品是《艾希曼在耶路撒冷:一份关于平庸的恶的报告》(Eichmann in Jerusalem: A Report on the Banality of Evil)"
+]
+++
汉娜·阿伦特报道了阿道夫·艾希曼在耶路撒冷因组织屠杀犹太人受审的案件,在法庭上,她发现艾希曼并不是一个冷静且思维缜密的杀手,相反,“说话时间越长,越能感受到他表达力的匮乏与思考能力的缺失,他不会站在别人的立场思考问题,之所以无法同他交流,并不是因为他说谎,而是因为他周围围绕着坚固的壁垒,屏蔽他的言辞和他人的存在,从而帮他一并拒绝着真相。”她震惊于恶的平庸性(Banality of Evil)。
@@ -15,7 +18,7 @@ toc = true
<!--more-->
-## No Exception
+## 艾尔特拉克在爪哇
众所周知,嘲讽 Java 是这个博客的传统,所以今天的文章也以这个开始。在 Java 中,处理「错误」的方式是**抛出异常**。这里的异常(Exception)是指程序中可以预料到的问题,比如用户本应输入整数却输入了非数字字符,而错误(Error)在 Java 中指的是那些几乎无法恢复,会使程序退出的问题。
@@ -117,4 +120,18 @@ void doSomething() throws Exception {
原来 Java 程序员在一开始就要区分 `throw` 和 `throws` 这种细微的区别,怪不得我那个半吊子 Python 老师这么喜欢[纠结语言保留字](https://www.geedea.pro/article/ready-steady-go/#:~:text=%E8%BF%99%E4%BD%8D%E8%80%81%E5%B8%88%E5%9C%A8%E5%B9%BB%E7%81%AF%E7%89%87%E4%B8%8A%E5%B1%95%E7%A4%BA%E4%BA%86%20Python%20%E7%9A%84%E6%89%80%E6%9C%89%E4%BF%9D%E7%95%99%E5%AD%97%EF%BC%8C%E7%84%B6%E5%90%8E%E6%8F%90%E5%87%BA%E4%BA%86%E4%B8%80%E4%B8%AA%E5%8C%AA%E5%A4%B7%E6%89%80%E6%80%9D%E7%9A%84%E9%97%AE%E9%A2%98%EF%BC%9A%E4%B8%8A%E9%9D%A2%E8%BF%99%E4%BA%9B%E4%BF%9D%E7%95%99%E5%AD%97%EF%BC%8C%E5%93%AA%E4%BA%9B%E6%98%AF%20Python%20%E7%8B%AC%E6%9C%89%E7%9A%84%EF%BC%9F%E4%BA%8E%E6%98%AF%E6%8E%A5%E4%B8%8B%E6%9D%A5%E7%9A%84%E5%87%A0%E5%8D%81%E5%88%86%E9%92%9F%EF%BC%8C%E6%88%91%E4%BB%AC%E9%83%BD%E5%9C%A8%E8%A7%A3%E5%86%B3%E8%BF%99%E4%B8%AA%E9%97%AE%E9%A2%98%E3%80%82)!
+与此同时,Lisp 程序员:*语法…… 语法太多了…… 看不懂……*。
+
+## No Exception
+
+让我们总结一下,在 Java 中,异常和崩溃都要被抛出。抛出异常就等于说是要调用者(或者调用者的调用者)接住并处理这个异常,把错误处理的责任向上传递。这其实很符合逻辑,因为有一些错误就是没办法在方法内部解决,比如一个发起 HTTP 请求的方法遇到请求超时就只能上报问题。抛出错误就等于说是要程序因无法处理的错误而终止。
+
+抛与接看起来很精巧,许多人都喜欢此类机制。如果机制是必要的,那么机制的存在使得学习和理解的成本上升,使得语言变得臃肿,或者引发机制内部的混淆与问题(比如 `Error` 也算 `Unhandled Exception`),似乎也还算能接受。可问题是,机制真的是必要的吗?我们真的需要这一层**额外的抽象**吗?
+
+程序中应该被解决的错误被称作异常,抽象为 `Exception`;程序中无法解决的错误被称作崩溃,抽象为 `Error`。这两个类都是被抛出的,被称作「可抛出类」,所以抽象为 `Throwable`。为什么需要最高的这层抽象?这种抽象真的合理吗?它的子类难道不是两个很不同的东西吗?
+
+思来想去,让 `Error` 和 `Exception` 归为一个基类的原因,我只能想到「它们都是被抛出的」这一个。正方形和矩形都是「可求面积的」,那么就可以都归类为 `Squarable` 吗?显然不能,正方形不能继承矩形已经是里氏替换原则的一个经典案例,让正方形和矩形都归为一个基类更是荒唐。类比之后可以发现,`Error` 和 `Exception` 也是如此,仅仅因为想让它们共用抛出机制就归为一个基类是愚蠢的。
+
+
+
[^1]: Panic: 另译「运行时恐慌」