api-error-handling — скилл для Claude Code: единый формат ошибок API
Скилл задаёт стандартный формат ответов об ошибках, класс ApiError и паттерн circuit breaker. Пригодится, когда API уходит в продакшен.
npx skills add secondsky/claude-skills --skill api-error-handling -a claude-codeЧто делает api-error-handling
Скилл описывает единый JSON-формат ошибки: код, сообщение, HTTP-статус, requestId, метка времени и список деталей по полям. Такой ответ одинаково выглядит на всех эндпоинтах, поэтому клиенту проще разбирать сбои, а вам — искать их по идентификатору запроса.
Внутри есть класс ApiError для Node.js с фабриками badRequest, notFound и unauthorized, глобальный обработчик ошибок для Express и реализация circuit breaker с порогом срабатывания и таймаутом восстановления. Отдельная ссылка ведёт на references/python-flask.md — там разобраны исключения во Flask, повторные попытки с экспоненциальной задержкой и интеграция с Sentry.
Обработчик намеренно скрывает текст ошибки при статусе 500 и отдаёт клиенту общее сообщение, а подробности пишет в лог. Это стоит держать в голове: если вы привыкли возвращать наружу текст исключения, поведение придётся менять. Стек в примерах — Node.js и Express; для Python смотрите файл в references.
Какие задачи решает
- свести ответы об ошибках к одному формату на всех эндпоинтах
- отдавать клиенту понятное сообщение вместо стектрейса
- связать ошибку с конкретным запросом через requestId
- разложить детали валидации по полям формы
- защитить внешний сервис от повторных вызовов при сбоях
Примеры запросов агенту
- Добавь в этот Express-роутер обработку ошибок в формате из скилла api-error-handling
- Сделай класс ApiError и глобальный обработчик, чтобы 500 не отдавал текст исключения
- Оберни вызов платёжного API в circuit breaker с порогом 5 сбоев
Как установить api-error-handling
1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill api-error-handling -a claude-code2Вручную: положить файлы
~/.claude/skills/api-error-handling/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/api-error-handling/
1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill api-error-handling -a codex2Вручную: положить файлы
.agents/skills/api-error-handling/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill api-error-handling -a cursor2Вручную: положить файлы
.cursor/skills/api-error-handling/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install secondsky/claude-skills api-error-handling2Вручную: положить файлы
.github/skills/api-error-handling/SKILL.md1Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill api-error-handling -a gemini-cli2Командой платформы
gemini skills install https://github.com/secondsky/claude-skills --path plugins/api-error-handling/skills/api-error-handlingВручную: положить файлы
.devin/skills/api-error-handling/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add secondsky/claude-skills --skill api-error-handling -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о api-error-handling
Как установить api-error-handling в Claude?
Выполните npx skills add secondsky/claude-skills --skill api-error-handling -a claude-code. После этого файл скилла лежит в ~/.claude/skills/api-error-handling/SKILL.md.
Что делает api-error-handling?
Задаёт стандартный формат ответа об ошибке с кодом, статусом и requestId, даёт класс ApiError для Node.js, глобальный обработчик для Express и паттерн circuit breaker.
Для каких языков есть примеры?
Основные примеры написаны на Node.js с Express. Для Python есть отдельный файл references/python-flask.md с исключениями во Flask, повторными попытками и интеграцией с Sentry.
Исходный текст
SKILL.md · MIT
---
name: api-error-handling
description: Implements standardized API error responses with proper status codes, logging, and user-friendly messages. Use when building production APIs, implementing error recovery patterns, or integrating error monitoring services.
license: MIT
---
# API Error Handling
Implement robust error handling with standardized responses and proper logging.
## Standard Error Response Format
```json
{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid request parameters",
"status": 400,
"requestId": "req_abc123",
"timestamp": "2025-01-15T10:30:00Z",
"details": [
{ "field": "email", "message": "Invalid email format" }
]
}
}
```
## Error Class (Node.js)
```javascript
class ApiError extends Error {
constructor(code, message, status = 500, details = null) {
super(message);
this.code = code;
this.status = status;
this.details = details;
}
static badRequest(message, details) {
return new ApiError('BAD_REQUEST', message, 400, details);
}
static notFound(resource) {
return new ApiError('NOT_FOUND', `${resource} not found`, 404);
}
static unauthorized() {
return new ApiError('UNAUTHORIZED', 'Authentication required', 401);
}
}
// Global error handler
app.use((err, req, res, next) => {
const status = err.status || 500;
const response = {
error: {
code: err.code || 'INTERNAL_ERROR',
message: status === 500 ? 'Internal server error' : err.message,
status,
requestId: req.id
}
};
if (err.details) response.error.details = err.details;
if (status >= 500) logger.error(err);
res.status(status).json(response);
});
```
## Circuit Breaker Pattern
```javascript
class CircuitBreaker {
constructor(threshold = 5, timeout = 30000) {
this.failures = 0;
this.threshold = threshold;
this.timeout = timeout;
this.state = 'CLOSED';
}
async call(fn) {
if (this.state === 'OPEN') throw new Error('Circuit open');
try {
const result = await fn();
this.failures = 0;
return result;
} catch (err) {
this.failures++;
if (this.failures >= this.threshold) {
this.state = 'OPEN';
setTimeout(() => this.state = 'HALF_OPEN', this.timeout);
}
throw err;
}
}
}
```
## Additional Implementations
See [references/python-flask.md](references/python-flask.md) for:
- Python Flask error handling with custom exceptions
- Circuit breaker with automatic recovery
- Retry with exponential backoff
- Sentry integration
## Best Practices
- Use consistent error format across all endpoints
- Include request IDs for traceability
- Log errors at appropriate severity levels
- Never expose stack traces to clients
- Distinguish client errors (4xx) from server errors (5xx)
- Provide actionable error messages
© secondsky · MIT · secondsky/claude-skills