M13 Domain Error

actionbook/rust-skills/skills/m13-domain-error

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

Use when designing domain error handling. Keywords: domain error, error categorization, recovery strategy, retry, fallback, domain error hierarchy, user-facing vs internal errors, error code design, circuit breaker, graceful degradation, resilience, error context, backoff, retry with backoff, error recovery, transient vs permanent error, 领域错误, 错误分类, 恢复策略, 重试, 熔断器, 优雅降级

AI 生成的概览

指导领域错误处理设计:错误分类、恢复策略、重试、回退与错误层级。

功能
该技能为领域错误处理提供设计指导,核心问题是:谁需要处理这个错误,以及他们应如何恢复。它给出错误分类表(面向用户、内部、系统、瞬时、永久)、思考提示、恢复模式(如带退避的重试、回退、熔断器、超时、舱壁隔离),并提供 Rust 错误层级与重试代码示例。它还列出常见错误与反模式,并指向相关技能以了解实现细节。
适用场景
在为某个领域或服务设计错误类型与恢复行为时使用,尤其是需要判断哪些错误面向用户、哪些属于内部、哪些可重试,以及应附带哪些上下文时。也适合用来审查现有错误处理中的反模式,例如字符串错误、无限重试或暴露内部错误。
运行要求
该技能不附带脚本或资源,仅为说明性指令。示例涉及 thiserror、anyhow、tokio-retry、backoff、failsafe-rs 等 Rust 库,但阅读这些指导无需安装任何内容。

Domain Error Strategy

Layer 2: Design Choices

Core Question

Who needs to handle this error, and how should they recover?

Before designing error types:

  • Is this user-facing or internal?
  • Is recovery possible?
  • What context is needed for debugging?

Error Categorization

Error TypeAudienceRecoveryExample
User-facingEnd usersGuide actionInvalidEmail, NotFound
InternalDevelopersDebug infoDatabaseError, ParseError
SystemOps/SREMonitor/alertConnectionTimeout, RateLimited
TransientAutomationRetryNetworkError, ServiceUnavailable
PermanentHumanInvestigateConfigInvalid, DataCorrupted

Thinking Prompt

Before designing error types:

  1. Who sees this error?

    • End user → friendly message, actionable
    • Developer → detailed, debuggable
    • Ops → structured, alertable
  2. Can we recover?

    • Transient → retry with backoff
    • Degradable → fallback value
    • Permanent → fail fast, alert
  3. What context is needed?

    • Call chain → anyhow::Context
    • Request ID → structured logging
    • Input data → error payload

Trace Up ↑

To domain constraints (Layer 3):

"How should I handle payment failures?"    ↑ Ask: What are the business rules for retries?    ↑ Check: domain-fintech (transaction requirements)    ↑ Check: SLA (availability requirements)
QuestionTrace ToAsk
Retry policydomain-*What's acceptable latency for retry?
User experiencedomain-*What message should users see?
Compliancedomain-*What must be logged for audit?

Trace Down ↓

To implementation (Layer 1):

"Need typed errors"    ↓ m06-error-handling: thiserror for library    ↓ m04-zero-cost: Error enum design
"Need error context"    ↓ m06-error-handling: anyhow::Context    ↓ Logging: tracing with fields
"Need retry logic"    ↓ m07-concurrency: async retry patterns    ↓ Crates: tokio-retry, backoff

Quick Reference

Recovery PatternWhenImplementation
RetryTransient failuresexponential backoff
FallbackDegraded modecached/default value
Circuit BreakerCascading failuresfailsafe-rs
TimeoutSlow operationstokio::time::timeout
BulkheadIsolationseparate thread pools

Error Hierarchy

rust
#[derive(thiserror::Error, Debug)]pub enum AppError {    // User-facing    #[error("Invalid input: {0}")]    Validation(String),
    // Transient (retryable)    #[error("Service temporarily unavailable")]    ServiceUnavailable(#[source] reqwest::Error),
    // Internal (log details, show generic)    #[error("Internal error")]    Internal(#[source] anyhow::Error),}
impl AppError {    pub fn is_retryable(&self) -> bool {        matches!(self, Self::ServiceUnavailable(_))    }}

Retry Pattern

rust
use tokio_retry::{Retry, strategy::ExponentialBackoff};
async fn with_retry<F, T, E>(f: F) -> Result<T, E>where    F: Fn() -> impl Future<Output = Result<T, E>>,    E: std::fmt::Debug,{    let strategy = ExponentialBackoff::from_millis(100)        .max_delay(Duration::from_secs(10))        .take(5);
    Retry::spawn(strategy, || f()).await}

Common Mistakes

MistakeWhy WrongBetter
Same error for allNo actionabilityCategorize by audience
Retry everythingWasted resourcesOnly transient errors
Infinite retryDoS selfMax attempts + backoff
Expose internal errorsSecurity riskUser-friendly messages
No contextHard to debug.context() everywhere

Anti-Patterns

Anti-PatternWhy BadBetter
String errorsNo structurethiserror types
panic! for recoverableBad UXResult with context
Ignore errorsSilent failuresLog or propagate
Box<dyn Error> everywhereLost type infothiserror
Error in happy pathPerformanceEarly validation

Related Skills

WhenSee
Error handling basicsm06-error-handling
Retry implementationm07-concurrency
Domain modelingm09-domain
User-facing APIsdomain-*

来源与署名

来源:actionbook/rust-skills位于skills/m13-domain-error提交5c40d3a

许可证: 无许可证

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

举报或申请下架