尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Eff错误处理完全指南:Either、Option、Validate与Error效果如何选?

Eff错误处理完全指南:Either、Option、Validate与Error效果如何选? Eff错误处理完全指南Either、Option、Validate与Error效果如何选【免费下载链接】effEff monad for cats - https://atnos-org.github.io/eff项目地址: https://gitcode.com/gh_mirrors/eff/effEff 是面向 Scala 与 cats 生态的函数式效果Effect库其Eff 错误处理提供了 Either、Option、Validate、Error 四种开箱即用的效果帮助新手以类型安全的方式表达失败、缺失、校验不通过、抛出异常等不同语义。本文用一张对比表 决策清单带你快速掌握Eff 错误效果如何选、如何组合避开最常见的选型误区。 先搞懂Eff 里的错误不止一种传统代码里所有失败都靠try/catch或空值硬扛语义模糊。Eff 的思路是把每一种可能不正常建模成独立的效果类型然后在效果栈effect stack里自由叠加、按需解释interpret。打个比方查用户不存在 →缺失Option 语义密码格式不对 →可累积的校验失败Validate 语义数据库连接被拒绝 →带错误信息的失败Either 语义执行中抛出 NPE →真正的异常Error 语义把这四件事分开建模你的类型签名本身就是一份文档。 四种错误处理效果一览表效果核心语义失败时典型场景源码模块OptionEffect值可能缺失结果为None无错误信息可选配置、可空字段、缓存未命中option/EitherEffect计算可能失败立即短路携带一个错误值业务错误、远程调用失败either/ValidateEffect校验可累积收集所有错误一次性返回表单验证、配置校验validate/ErrorEffect可能抛异常捕获Throwable并转为失败包装不可信代码、IO 副作用error/四者分别定义在 EitherEffect.scala、OptionEffect.scala、ValidateEffect.scala 和 ErrorEffect.scala 中均为trait ... Creation with ... Interpretation的组合结构——创建Creation负责发射效果解释Interpretation负责运行与处理。 OptionEffect值可能没有用缺失表达适用场景缺失不是错误而是正常状态。比如读取可选配置项、查询缓存、解析可空字段。此时没有错误信息可携带用Either反而要硬造一个无意义的错误类型。import org.atnos.eff._, syntax.all._ // 效果栈里声明 Option 效果 val program: Eff[Option |, String] maybeUser (u pure(sHello $u)) OptionEffect.runOption(program) // Option[String]选型信号如果你说不出错误是什么只是可能拿不到值选Option。✅ EitherEffect失败必须短路选它适用场景一次失败就应终止流程且需要携带错误详情。EitherEffect是 Eff 错误处理的中流砥柱核心解释器能力都定义在 EitherInterpretation.scala 中runEither—— 运行效果栈得到Either[E, A]catchLeft—— 在栈内部捕获Left并转换恢复类似recoverWithzoomEither/translateEither—— 在不同错误类型之间转换方便模块化组合catchLeftCombine—— 在并行/applicative 分支中合并多个错误要求E有Semigroup实例// 捕获失败并降级而不是让错误逃逸到最外层 catchLeftOption |, String, Int(err pure(defaultValue))选型信号失败要立刻停下 错误有信息量→ Either。 ValidateEffect错误要攒一批再报选它适用场景表单校验、批量配置检查——用户希望一次看到所有问题而不是一条条修。ValidateEffect.scala 的注释直接点明主题can fail but willaccumulateerrors。它对应 cats 的Validated创建与解释逻辑分别在 ValidateCreation.scala 与 ValidateInterpretation.scalawrong(e)/correct()—— 发射失败/成功warning(e)—— 甚至支持有警告但通过的第三态runValidatedNel—— 运行后得到ValidatedNel[E, A]所有错误都被收集catchAllWrongs—— 在栈内一次性拦截全部错误// 多个校验并行收集最终一次返回全部错误 val checks: Eff[Validate[String, *] |, Unit] ... ValidateEffect.runValidatedNel(checks) // ValidatedNel[String, Unit]选型信号把所有问题一次列出来→ Validate。与 Either 最大的区别Either 短路Validate 累积。 ErrorEffect捕获异常给不可信代码上保险适用场景调用可能抛Throwable的代码、包装副作用计算。ErrorEffect.scala 的注释把它描述为 Eval 与 Either 的混合体交给它的计算默认视为不纯失败类型F用于承载自定义错误而Throwable也会被一并捕获。创建入口在 ErrorCreation.scalaok(a)—— 包装一个可能出错的计算exception(t)/fail(f)—— 发射异常 / 自定义失败ErrorEffect.render—— 将Throwable渲染为友好的错误字符串import ErrorEffect._ // 不安全的计算被安全地收进 Eff 栈 ok(unsafeParse(input)) flatMap (value pure(value * 2))选型信号这段代码会真的抛异常→ ErrorEffect 负责把异常驯服成值避免异常逃逸破坏纯计算。 终极选型清单30 秒做出决定按顺序问自己三个问题只是可能拿不到没有错误概念→OptionEffect会抛ThrowableIO、解析、外部库→ 用ErrorEffect包裹失败时有信息量要立即终止流程 →EitherEffect要收集全部错误一次报告 →ValidateEffect缺失 → Option 会抛异常 → Error包裹 失败短路 信息 → Either 失败累积 信息 → Validate✅ 加分技巧四种效果可以共存于同一个效果栈如Either[String, *] *| Option *| ...在需要时用translateEither等翻译器把底层错误提升为更高层的错误类型实现模块化的错误边界。更多效果栈变换思路可参考 TransformStack 的示例文档。 关键源码与资料索引核心效果类型Eff定义于core/src/main/scala/org/atnos/eff/Eff.scala效果成员解析见core/src/main/scala/org/atnos/eff/Member.scalaEither 效果either/src/main/scala/org/atnos/eff/EitherCreation.scala、EitherInterpretation.scalaOption 效果option/src/main/scala/org/atnos/eff/OptionCreation.scala、OptionInterpretation.scalaValidate 效果validate/src/main/scala/org/atnos/eff/ValidateCreation.scala、ValidateInterpretation.scalaError 效果error/src/main/scala/org/atnos/eff/ErrorCreation.scala、ErrorInterpretation.scala效果组合示例all/src/test/scala/org/atnos/eff/EitherEffectSpec.scala、ValidateEffectSpec.scala可作为行为参考一句话总结Eff 错误处理的选型本质是回答失败的语义是什么——缺失用 Option异常用 Error 包裹短路失败用 Either累积校验用 Validate。语义清晰了你的代码也就可读了。【免费下载链接】effEff monad for cats - https://atnos-org.github.io/eff项目地址: https://gitcode.com/gh_mirrors/eff/eff创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表