Loading...
Loading...
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
npx skill4agent add zhanghandong/rust-skills m06-error-handlingLayer 1: Language Mechanics
| Pattern | Don't Just Say | Ask 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? |
"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)| Situation | Trace To | Question |
|---|---|---|
| Too many unwraps | m09-domain | Is the data model right? |
| Error context design | m13-domain-error | What recovery is needed? |
| Library vs app errors | m11-ecosystem | Who are the consumers? |
"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")| Pattern | When | Example |
|---|---|---|
| Recoverable error | |
| Absence is normal | |
| Propagate error | |
| Dev/test only | |
| Invariant holds | |
| Unrecoverable | |
| Context | Error Crate | Why |
|---|---|---|
| Library | | Typed errors for consumers |
| Application | | Ergonomic error handling |
| Mixed | Both | thiserror at boundaries, anyhow internally |
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 ?| Error | Cause | Fix |
|---|---|---|
| Unhandled None/Err | Use |
| Type mismatch | Different error types | Use |
| Lost context | | Add |
| Missing Result return | Return |
| Anti-Pattern | Why Bad | Better |
|---|---|---|
| Panics in production | |
| Ignore errors silently | Bugs hidden | Handle or propagate |
| Bad UX, no recovery | Result |
| Box<dyn Error> everywhere | Lost type info | thiserror |
| When | See |
|---|---|
| Domain error strategy | m13-domain-error |
| Crate boundaries | m11-ecosystem |
| Type-safe errors | m05-type-driven |
| Mental models | m14-mental-model |