返回 Skills 目录
riekelt/principal-engineer已通过检查

SKILL DETAIL

handling-failures

riekelt/principal-engineer/handling-failures

该技能用于处理任何语言、任何仓库中的错误路径、捕获块、回退、默认值、重试或降级模式。它编码了“不静默吞没”的契约和“故障响亮”的纪律。每当即将捕获异常、为 null 提供默认值,或失败可能被忽视时,都应使用此技能,即使目标是“仅仅让它不崩溃”。 核心契约是:每个失败路径必须执行以下三项操作之一,且所有操作都是响亮的:记录 WARN 或 ERROR 日志并重新抛出;记录日志并返回调用方必须处理的类型化失败;或记录日志并进入明确记录的降级模式。禁止裸捕获并继续、捕获并返回掩盖失败的默认值,以及隐藏主失败的回退。缺失的必需条目必须响亮失败,错误状态必须可见,操作员可读的修复说明必须具体,重试必须有界且可观察,副作用操作的重放必须幂等,降级模式必须有界限,可观察性是最低要求。

安装量 · 321查看来源

Installation

npx skills add https://github.com/riekelt/principal-engineer --skill handling-failures

技能文件

SKILL.md

最近同步 · 2026年10月21日

SKILL.md›
---
name: handling-failures
description: Use when writing or touching any error path, catch block, fallback, default value, retry, or degraded mode - in any language, any repo. Encodes the no-silent-swallows contract and the fail-loud discipline. Use whenever an exception is about to be caught, a null is about to get a default, or a failure could pass unnoticed, even if the goal is "just make it not crash".
---

# Handling failures

**REQUIRED BACKGROUND:** the `principal-engineering` skill.

## Overview

A swallowed error is a bug with its evidence destroyed. Core contract: **every failure path does exactly one of three things, and all three are loud.** A system that looks healthy while serving wrong data is worse than one that crashes.

## The contract

Every catch and failure path either:

1. **Logs at WARN or ERROR and rethrows**, or
2. **Logs and returns a TYPED failure the caller must handle** (a result type, a sealed error, a status the compiler or contract forces downstream code to acknowledge), or
3. **Logs and enters an explicitly documented degraded mode** (named in the code and its documentation, with something observable saying the system is degraded).

Forbidden, no exceptions:

- Bare catch-and-continue.
- Catch-and-return-default (empty list, null, zero, cached copy) that masks the failure.
- `?? fallback` and its cousins where the fallback hides that the primary failed. A fallback is acceptable only when the absence is ALSO surfaced loudly elsewhere.

## Corollaries

- **A missing required entry fails loud.** Something absent from a registry, config, or catalog is a build or startup failure, never a silent default.
- **Error states are visible.** A workflow must not appear healthy while failing; surface the error state in the UI, the metrics, or the logs someone actually watches.
- **Operator-facing remediation is specific.** "connection failed, check REDIS_URL and whether redis responds to PING" beats "an error occurred".
- **Retries are bounded and observable.**
- **Replays of side-effecting operations are idempotent.**
- **Degraded modes have a bound.** Skip-and-continue needs the explicit threshold where degradation becomes abort, as a named, operator-tunable constant. The guard must exist; its value is a judgment call to make with the owner. An unbounded degraded mode is a slow-motion swallow.
- **On failure paths, observability is part of the minimum**, not gold-plating. The log line, the counter, and the alert ship with the fix; a failure path without them is the silent swallow with better intentions.

## Touching existing swallows

Code you are editing that already swallows: fix it as part of the work, or explicitly flag it as owed with what it hides. Leaving it silently is endorsing it. In review, a NEW silent swallow is an automatic BLOCKER; a pre-existing one you touched and left unflagged is a WARNING against the change.

## Common mistakes

- "It should never happen" as a reason to swallow. Those paths are exactly the ones that need a loud alarm when they do.
- Logging at DEBUG and calling it handled. If nobody sees it in production, it is a swallow with extra steps.
- Catching broad (`Exception`, `catch {}`) to handle narrow. The unexpected failure dies silently beside the expected one.
- A degraded mode nobody documented. Degradation only the author knows about is an outage the operator cannot diagnose.
- Making the test pass by defaulting the failure. The test goes green; the defect graduates to production.