M06 Error Handling

作者 actionbook5c40d3ad7851无许可证1.5K 个星标收录于 2026年10月8日更新于 2026年10月8日仓库6周前更新

CRITICAL: Use for error handling. Triggers: Result, Option, Error, ?, unwrap, expect, panic, anyhow, thiserror, when to panic vs return Result, custom error, error propagation, 错误处理, Result 用法, 什么时候用 panic

AI 生成的概览

指导 Rust 错误处理在 Result、Option、panic、thiserror 与 anyhow 之间的选择。

功能
这是一个仅含说明的技能,提供 Rust 错误处理的决策框架。它帮助智能体判断某个失败是预期情况还是缺陷,然后在 Result、Option、panic、thiserror 与 anyhow 之间做出选择。内容包含速查表、决策流程图、常见错误、反模式以及相关技能指引。
适用场景
适用于编写或审查涉及 Result、Option、?、unwrap、expect、panic、anyhow 或 thiserror 的 Rust 代码。它面向何时应 panic、何时应返回 Result、如何携带上下文传播错误以及如何设计自定义错误类型等问题。
运行要求
无需脚本或运行时依赖,仅为说明性内容。文中将 Rust 的 thiserror 与 anyhow 作为主题提及,但并不要求安装它们。

Error Handling

Layer 1: Language Mechanics

Core Question

Is this failure expected or a bug?

Before choosing error handling strategy:

  • Can this fail in normal operation?
  • Who should handle this failure?
  • What context does the caller need?

Error → Design Question

PatternDon't Just SayAsk Instead
unwrap panics"Use ?"Is None/Err actually possible here?
Type mismatch on ?"Use anyhow"Are error types designed correctly?
Lost error context"Add .context()"What does the caller need to know?
Too many error variants"Use Box<dyn Error>"Is error granularity right?

Thinking Prompt

Before handling an error:

  1. What kind of failure is this?

    • Expected → Result<T, E>
    • Absence normal → Option<T>
    • Bug/invariant → panic!
    • Unrecoverable → panic!
  2. Who handles this?

    • Caller → propagate with ?
    • Current function → match/if-let
    • User → friendly error message
    • Programmer → panic with message
  3. What context is needed?

    • Type of error → thiserror variants
    • Call chain → anyhow::Context
    • Debug info → anyhow or tracing

Trace Up ↑

When error strategy is unclear:

"Should I return Result or Option?"    ↑ Ask: Is absence/failure normal or exceptional?    ↑ Check: m09-domain (what does domain say?)    ↑ Check: domain-* (error handling requirements)
SituationTrace ToQuestion
Too many unwrapsm09-domainIs the data model right?
Error context designm13-domain-errorWhat recovery is needed?
Library vs app errorsm11-ecosystemWho are the consumers?

Trace Down ↓

From design to implementation:

"Expected failure, library code"    ↓ Use: thiserror for typed errors
"Expected failure, application code"    ↓ Use: anyhow for ergonomic errors
"Absence is normal (find, get, lookup)"    ↓ Use: Option<T>
"Bug or invariant violation"    ↓ Use: panic!, assert!, unreachable!
"Need to propagate with context"    ↓ Use: .context("what was happening")

Quick Reference

PatternWhenExample
Result<T, E>Recoverable errorfn read() -> Result<String, io::Error>
Option<T>Absence is normalfn find() -> Option<&Item>
?Propagate errorlet data = file.read()?;
unwrap()Dev/test onlyconfig.get("key").unwrap()
expect()Invariant holdsenv.get("HOME").expect("HOME set")
panic!Unrecoverablepanic!("critical failure")

Library vs Application

ContextError CrateWhy
LibrarythiserrorTyped errors for consumers
ApplicationanyhowErgonomic error handling
MixedBoththiserror at boundaries, anyhow internally

Decision Flowchart

Is failure expected?├─ Yes → Is absence the only "failure"?│        ├─ Yes → Option<T>│        └─ No → Result<T, E>│                 ├─ Library → thiserror│                 └─ Application → anyhow└─ No → Is it a bug?        ├─ Yes → panic!, assert!        └─ No → Consider if really unrecoverable
Use ? → Need context?├─ Yes → .context("message")└─ No → Plain ?

Common Errors

ErrorCauseFix
unwrap() panicUnhandled None/ErrUse ? or match
Type mismatchDifferent error typesUse anyhow or From
Lost context? without contextAdd .context()
cannot use ?Missing Result returnReturn Result<(), E>

Anti-Patterns

Anti-PatternWhy BadBetter
.unwrap() everywherePanics in production.expect("reason") or ?
Ignore errors silentlyBugs hiddenHandle or propagate
panic! for expected errorsBad UX, no recoveryResult
Box<dyn Error> everywhereLost type infothiserror

Related Skills

WhenSee
Domain error strategym13-domain-error
Crate boundariesm11-ecosystem
Type-safe errorsm05-type-driven
Mental modelsm14-mental-model

来源与署名

来源:actionbook/rust-skills位于skills/m06-error-handling提交5c40d3a

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架