异常即主流,标注即文档
没有受检异常,EAFP 是哲学;类型标注把 Java 编译器的检查搬回来当可选插件。
14 分钟 · 右栏代码可点击「运行」
try/catch → try/except/else/finally
Java
1try {2 int v = Integer.parseInt(raw);3 } catch (NumberFormatException e) {4 v = 0;5 } finally {6 cleanup();7 }
Python
1try:2 v = int(raw)3except ValueError: # 永远写具体异常,别裸 except4 v = 05else: # 没抛异常时执行(Java 没有)6 audit(v)7finally:8 cleanup()
- 自定义异常 = 继承
Exception:class AppError(Exception): ...。抛出用raise。 - 异常链:
raise ParseError(...) from e,等价于 Java 的 cause。
EAFP:先做,炸了再处理
Java
1if (map.containsKey(key)) {2 return map.get(key);3}4return DEFAULT; // LBYL:先检查再做
Python
1try:2 return cache[key]3except KeyError:4 return DEFAULT # EAFP:直接做,失败兜底
- EAFP(Easier to Ask Forgiveness than Permission)是 Python 官方哲学。检查与执行之间的竞态也顺带消失了。
- 受检异常不存在 —— 方法签名不声明会抛什么,靠文档字符串和
Raises:段落约定。
类型标注:把编译器当可选插件
Java
1Optional<User> findUser(String id);2List<String> tags;34// 编译期强制
Python
1def find_user(uid: str) -> User | None: ...2tags: list[str] = []34# 运行时完全忽略标注,但:5# mypy / pyright 会在静态阶段报错
Optional[T]/T | None取代@Nullable;泛型用小写内建list[str]、dict[str, int](3.9+)。- 现代 Python 项目标注覆盖率很高,CI 里跑
pyright就能找回大半个 Java 编译器的安全感。
TIP
开发流程对比 — Java:写码 → javac 报错 → 修。Python:写码 → 跑/测试发现 → 修,静态错误由 pyright 在编辑器里实时补位。IDE 里装 Pylance,体验立刻接近 Java。
练一练
这张卡的示例代码已在游乐场中备好,改一改再运行。