函数式编程用either类型将错误作为值传递,right封装成功结果,left封装错误信息,通过map、mapleft、fold和chain实现错误的显式处理与链式组合,避免throw/catch,保持纯函数特性。

函数式编程不靠 throw 和 try/catch 打断执行流,而是把错误当作值来传递和组合。关键在于避免副作用、保持纯函数特性,同时让错误路径清晰可测、可链式处理。
用 Either 类型建模“成功或失败”
Either 是函数式错误处理的基石:Right 包裹正常结果,Left 包裹错误信息。它不抛异常,也不中断调用链,只是把两种可能都显式表达为数据。
- 所有可能出错的操作(如 JSON 解析、除法、对象取值)都应返回
Either,而不是直接 throw - 用
map处理 Right 中的值,用mapLeft统一修饰错误信息 - 用
fold(或caseOf)在最后一步决定如何渲染或上报 —— 比如 UI 显示提示,或 fallback 到默认值
业务逻辑与错误处置彻底分离
一个函数只做一件事:专注计算。错误怎么响应、记录、重试或降级,由外部组合器决定。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 写纯函数时完全不写
try、catch或if (err),例如:safeParse = (s) => isJson(s) ? Right(JSON.parse(s)) : Left(new Error('Invalid JSON')) - 用
chain(flatMap)串起多个可能失败的操作:前一个返回 Left,后续自动跳过,整个链直接产出 Left - 错误恢复逻辑(如重试、兜底值)用独立函数封装,比如
recoverWith(defaultVal),只作用于 Left,不影响 Right 流程
Promise 场景下融合函数式错误流
异步操作天然带失败可能,但 Promise 的 .catch() 仍是命令式风格。可将其转为 Either 风格统一处理。
- 封装
promiseToEither = (p) => p.then(v => Right(v)).catch(e => Left(e)) - 后续用
chain组合多个异步操作,错误不会丢失,也不会被静默吞掉 - 避免
.then(fn).catch(handle)这种写法 —— 它无法捕获fn内部抛出的同步错误;改用chain(fn)可同时覆盖同步和异步失败分支
慎用 try/catch,仅限边界层
在函数式核心代码之外,比如事件处理器、API 入口、React effect 中,仍需用 try/catch 做兜底,防止未预见的运行时错误穿透到用户界面。
- 这里 catch 到的错误,应立即转为 Left 并交还给函数式流程,而不是就地处理
- 不要在纯函数内部包裹
try/catch—— 这会污染纯度,也违背“错误即数据”的原则 - 日志、监控等副作用操作,必须放在 fold 或最终消费者中,而非中间转换步骤里
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










