К основному содержанию
скилл CX Codex

go-error-handling — скилл для Claude Code: что делает и как установить

Скилл учит агента писать надёжную обработку ошибок в Go: выбирать между %w и %v, задавать sentinel-ошибки и не смешивать логирование с возвратом.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add cxuu/golang-skills --skill go-error-handling -a claude-code
Открыть на GitHub

Что делает go-error-handling

Скилл задаёт строгие правила работы с ошибками в Go. Он запрещает возвращать конкретные типы вроде *os.PathError из экспортированных функций, чтобы избежать проблем с nil-интерфейсом. Также скилл пресекает возврат ошибок внутри значений (например, -1 или пустых строк) и следит за оформлением: сообщения об ошибках пишутся со строчной буквы и без знаков препинания на конце.

В репозитории есть готовые справочники и проверочный скрипт scripts/check-errors.sh, который вызывает scripts/check-errors-ast.go для анализа AST-дерева. Скрипт находит скрытые антипаттерны: сопоставление ошибок по строкам, голую передачу ошибок без контекста и одновременное логирование с возвратом (log-and-return).

Для работы с цепочками ошибок через errors.Is, errors.As и директиву %w потребуется версия Go 1.13 или новее, а примеры структурированного логирования используют пакет log/slog из Go 1.21+. Паттерны с panic и recover сюда намеренно не входят — для них предусмотрен отдельный скилл go-defensive.

Какие задачи решает

  • выбрать между директивами %w и %v при оборачивании ошибки
  • устранить антипаттерн одновременного логирования и проброса ошибки
  • заменить возврат конкретных типов ошибок на интерфейс error
  • организовать обработку сбоев параллельных задач через errgroup

Примеры запросов агенту

  • Проверь эту функцию на утечку внутренних деталей и подскажи, нужен ли здесь %w или %v.
  • Помоги объявить sentinel-ошибку для API и добавить проверку через errors.Is.
  • Запусти проверку антипаттернов обработки ошибок через scripts/check-errors.sh.

Как установить go-error-handling

1Через Skills CLI (Vercel)

npx skills add cxuu/golang-skills --skill go-error-handling -a claude-code

2Вручную: положить файлы

~/.claude/skills/go-error-handling/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/go-error-handling/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора19

go-code-review Проверяет Go-код по общепринятым стандартам стиля и выдаёт замечания по severity. Пригодится перед отправкой PR. CX Codex +1 1 700установок go-documentation Пишет и проверяет доккомментарии для экспортируемых типов, функций и пакетов Go. Срабатывает и сам, когда вы создаёте новый экспортируемый API. CX Codex +1 1 300установок go-concurrency Правила для горутин, каналов и мьютексов, чтобы агент не плодил утечки и гонки данных в Go-коде. CX Codex +1 1 300установок go-testing Скилл для написания и разбора тестов на Go: table-driven тесты, сабтесты, хелперы и сравнение через cmp.Diff. Пригодится, когда агент пишет тест к функции. CX Codex +1 1 300установок go-control-flow Скилл учит агента писать канонические циклы, ветвления и switch в Go. Пригодится при оформлении guard clauses и предотвращении багов с затенением переменных. CX Codex +1 1 200установок go-functional-options Скилл подсказывает, как собрать конструктор в Go с необязательными настройками через функциональные опции. Пригодится, когда у New* уже три и больше необязательных параметров. CX Codex +1 1 200установок go-data-structures Скилл для ИИ-агента, который подсказывает идиомы Go при работе со срезами, картами и массивами: make против new, append, nil-срезы и JSON. CX Codex +1 1 200установок go-packages Задаёт правила разбиения Go-кода на пакеты, структурирует импорты и запрещает пакеты util. Пригодится на старте проекта или при рефакторинге растущей кодовой базы. CX Codex +1 1 200установок

Похожие

error-handling affaan-m Скилл задаёт единые правила обработки ошибок в TypeScript, Python и Go: типизированные исключения, ретраи, circuit breaker, тексты для пользователя. CX Codex +1 4 800установок golang-error-handling samber Скилл для идиоматичной обработки ошибок в Go: оборачивание с контекстом, проверка цепочек, структурированное логирование и интеграция с samber/oops. Применяется при создании, оборачивании, инспекции и логировании ошибок. CX Codex +1 43 400установок error-handling-patterns Seth Hobson Скилл помогает проектировать обработку ошибок: исключения, Result-типы, передачу контекста и graceful degradation. Пригодится для API и отладки сбоев. CX Codex 22 957установок m06-error-handling actionbook Помогает ИИ-агенту выбирать правильный способ обработки ошибок в Rust. Пригодится, когда нужно решить между Result, Option, panic!, thiserror и anyhow. CX Codex +1 3 500установок Error Handling taste f Промпт задаёт ИИ-ассистенту вкус бэкенд-инженера на TypeScript: как валидировать вход, разделять ожидаемые ошибки и баги, логировать и отдавать клиенту. GP ChatGPT ★ 174 597звёзд репо iii-error-handling iii-hq Скилл учит агента распознавать коды ошибок iii-движка и SDK, различать сетевые сбои от отказов в доступе, определять, когда повторять вызов безопасно. Нужен, если пишешь код на Node, Python, Rust или в браузере с вызовами удалённых функций. CX Codex +1 4 100установок

Рядом в теме «Языки программирования»

Все скиллы по теме «Языки программирования» →

Вопросы о go-error-handling

Как установить go-error-handling в Claude Code?

Выполните команду npx skills add cxuu/golang-skills --skill go-error-handling -a claude-code. Также можно вручную поместить файл по пути ~/.claude/skills/go-error-handling/SKILL.md.

Что делает скилл go-error-handling?

Он задаёт правила создания, оборачивания и перехвата ошибок в Go, а также предоставляет AST-скрипты для поиска типичных ошибок в коде.

Подходит ли этот скилл для работы с panic и recover?

Нет, скилл исключает сценарии с panic и recover. Для защиты от аварийных завершений и написания гардов используется скилл go-defensive.

Исходный текст

SKILL.md · Apache-2.0
---
name: go-error-handling
description: Use when writing Go code that returns, wraps, or handles errors — choosing between sentinel errors, custom types, and fmt.Errorf (%w vs %v), structuring error flow, or deciding whether to log or return. Also use when propagating errors across package boundaries or using errors.Is/As, even if the user doesn't ask about error strategy. Does not cover panic/recover patterns (see go-defensive).
allowed-tools: Bash(bash:*)
---

# Go Error Handling

> Compatibility: `errors.Is`, `errors.As`, and `%w` wrapping require Go 1.13+; structured logging examples may use `log/slog` from Go 1.21+.

## Resource Routing

- `scripts/check-errors.sh` - Run when checking string-based error matching, bare error propagation, and log-and-return patterns.
- `scripts/check-errors-ast.go` - Implementation helper invoked by `check-errors.sh`; patch this when changing error-flow analysis behavior.
- `references/ERROR-FLOW.md` - Read when deciding where to handle, wrap, log, or return errors.
- `references/ERROR-TYPES.md` - Read when choosing sentinel errors, typed errors, or opaque errors.
- `references/WRAPPING.md` - Read when choosing `%w` versus `%v` or crossing package boundaries.

In Go, [errors are values](https://go.dev/blog/errors-are-values) — they are
created by code and consumed by code.

## Choosing an Error Strategy

1. System boundary (RPC, IPC, storage)? → Wrap with `%v` to avoid leaking internals
2. Caller needs to match specific conditions? → Sentinel or typed error, wrap with `%w`
3. Caller just needs debugging context? → `fmt.Errorf("...: %w", err)`
4. Leaf function, no wrapping needed? → Return the error directly

**Default**: wrap with `%w` and place it at the end of the format string.

---

## Core Rules

### Never Return Concrete Error Types

**Never return concrete error types from exported functions** — a concrete `nil`
pointer can become a non-nil interface:

```go
// Bad: Concrete type can cause subtle bugs
func Bad() *os.PathError { /*...*/ }

// Good: Always return the error interface
func Good() error { /*...*/ }
```

### Error Strings

Error strings should **not** be capitalized and should **not** end with
punctuation. Exception: exported names, proper nouns, or acronyms.

```go
// Bad
err := fmt.Errorf("Something bad happened.")

// Good
err := fmt.Errorf("something bad happened")
```

For displayed messages (logs, test failures, API responses), capitalization is
appropriate.

### Return Values on Error

When a function returns an error, callers must treat all non-error return values
as unspecified unless explicitly documented.

**Tip**: Functions taking a `context.Context` should usually return an `error`
so callers can determine if the context was cancelled.

---

## Handling Errors

When encountering an error, make a **deliberate choice** — do not discard
with `_`:

1. **Handle immediately** — address the error and continue
2. **Return to caller** — optionally wrapped with context
3. **In exceptional cases** — `log.Fatal` or `panic`

To intentionally ignore: add a comment explaining why.

```go
n, _ := b.Write(p) // never returns a non-nil error
```

For related concurrent operations, use
[`errgroup`](https://pkg.go.dev/golang.org/x/sync/errgroup):

```go
g, ctx := errgroup.WithContext(ctx)
g.Go(func() error { return task1(ctx) })
g.Go(func() error { return task2(ctx) })
if err := g.Wait(); err != nil { return err }
```

### Avoid In-Band Errors

Don't return `-1`, `nil`, or empty string to signal errors. Use multiple
returns:

```go
// Bad: In-band error value
func Lookup(key string) int  // returns -1 for missing

// Good: Explicit error or ok value
func Lookup(key string) (string, bool)
```

This prevents callers from writing `Parse(Lookup(key))` — it causes a
compile-time error since `Lookup(key)` has 2 outputs.

---

## Error Flow

Handle errors before normal code. Early returns keep the happy path unindented:

```go
// Good: Error first, normal code unindented
if err != nil {
    return err
}
// normal code
```

**Handle errors once** — either log or return, never both:

```
Error encountered?
├─ Caller can act on it? → Return (with context via %w)
├─ Top of call chain? → Log and handle
└─ Neither? → Log at appropriate level, continue
```

---

## Error Types

> **Advisory**: Recommended best practice.

| Caller needs to match? | Message type | Use |
|------------------------|--------------|-----|
| No | static | `errors.New("message")` |
| No | dynamic | `fmt.Errorf("msg: %v", val)` |
| Yes | static | `var ErrFoo = errors.New("...")` |
| Yes | dynamic | custom `error` type |

**Default**: Wrap with `fmt.Errorf("...: %w", err)`. Escalate to sentinels for
`errors.Is()`, to custom types for `errors.As()`.

---

## Error Wrapping

> **Advisory**: Recommended best practice.

- **Use `%v`**: At system boundaries, for logging, to hide internal details
- **Use `%w`**: To preserve error chain for `errors.Is`/`errors.As`

**Key rules**: Place `%w` at the end. Add context callers don't have. If
annotation adds nothing, return `err` directly.

> **Validation**: After implementing error handling, run `bash scripts/check-errors.sh` to detect common anti-patterns. Then run `go vet ./...` to catch additional issues.

---

## Related Skills

- **Error naming**: See [go-naming](../go-naming/SKILL.md) when naming sentinel errors (`ErrFoo`) or custom error types
- **Testing errors**: See [go-testing](../go-testing/SKILL.md) when testing error semantics with `errors.Is`/`errors.As` or writing error-checking helpers
- **Panic handling**: See [go-defensive](../go-defensive/SKILL.md) when deciding between panic and error returns, or writing recover guards
- **Guard clauses**: See [go-control-flow](../go-control-flow/SKILL.md) when structuring early-return error flow or reducing nesting
- **Logging decisions**: See [go-logging](../go-logging/SKILL.md) when choosing log levels, configuring structured logging, or deciding what context to include in log messages

© cxuu · Apache-2.0 · cxuu/golang-skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой