error-handling-patterns
Реализация надежных паттернов обработки ошибок
Приложения часто неожиданно выходят из строя из-за некачественной обработки ошибок. Этот навык предоставляет проверенные на практике паттерны для исключений, типов Result, автоматических выключателей и плавной деградации для Python, TypeScript, Rust и Go.
Скачать ZIP навыка
Загрузить в Claude
Перейдите в Settings → Capabilities → Skills → Upload skill
Включите и начните использовать
Протестировать
Использование «error-handling-patterns». Add error handling to a function that reads a file and parses JSON content.
Ожидаемый результат:
Here is a pattern for robust file handling with proper error hierarchy:
**Python Example:**
```python
class FileReadError(ApplicationError):
"""Raised when file read operations fail."""
pass
class ParseError(ApplicationError):
"""Raised when JSON parsing fails."""
pass
def read_json_file(path: str) -> dict:
try:
with open(path, 'r') as f:
content = f.read()
return json.loads(content)
except FileNotFoundError as e:
raise FileReadError(f"File not found: {path}", details={"path": path}) from e
except json.JSONDecodeError as e:
raise ParseError(f"Invalid JSON in file: {path}", details={"path": path, "error": str(e)}) from e
```
**Key practices:**
- Use specific exception types for different error scenarios
- Include contextual information in exceptions
- Chain exceptions to preserve original stack trace
- Use context managers for automatic resource cleanup
Использование «error-handling-patterns». How should I handle errors in an async function that calls multiple services in parallel?
Ожидаемый результат:
For parallel service calls, consider these strategies:
**Option 1: Aggregate Errors**
Collect all errors and report them together rather than failing on the first error.
```typescript
async function fetchUserData(userId: string): Promise<UserData> {
const errors: Error[] = [];
let user: User | null = null;
let orders: Order[] = [];
try { user = await userService.getUser(userId); }
catch (e) { errors.push(e); }
try { orders = await orderService.getOrders(userId); }
catch (e) { errors.push(e); }
if (errors.length > 0) {
throw new AggregateError(errors, `${errors.length} operations failed`);
}
return { user, orders };
}
```
**Option 2: Result Types**
Use explicit success/failure types for each operation.
```typescript
async function fetchUserData(userId: string): Promise<Result<UserData>> {
const [userResult, ordersResult] = await Promise.all([
safePromise(userService.getUser(userId)),
safePromise(orderService.getOrders(userId))
]);
if (!userResult.ok) return Err(userResult.error);
if (!ordersResult.ok) return Err(ordersResult.error);
return Ok({ user: userResult.value, orders: ordersResult.value });
}
```
Использование «error-handling-patterns». What are the worst error handling anti-patterns to avoid?
Ожидаемый результат:
Here are the most dangerous anti-patterns and their fixes:
**Anti-Pattern 1: Empty Catch Blocks**
```python
try:
do_something()
except:
pass # Silent failure - bugs hide forever
```
**Fix:** Always log or re-raise exceptions.
**Anti-Pattern 2: Catching Too Broadly**
```python
try:
do_something()
except Exception:
# Hides bugs including typos and logic errors
pass
```
**Fix:** Catch specific exception types only.
**Anti-Pattern 3: Swallowing After Logging**
```python
try:
do_something()
except Exception as e:
logger.error(e)
# Error logged but not handled - caller doesn't know it failed
```
**Fix:** Re-raise or return error result.
**Anti-Pattern 4: Overly Generic Errors**
```python
raise Exception("Error occurred") # No context, no code, useless for debugging
```
**Fix:** Include what happened, what was being processed, and error codes.
Аудит безопасности
БезопасноAll static findings are false positives. The skill is legitimate educational documentation about error handling patterns across Python, TypeScript, Rust, and Go. Static scanner misidentified 'error' keywords as cryptographic issues and Markdown code fences as shell backticks. No actual network calls, command execution, or malicious patterns exist in the skill content.
Оценка качества
Что вы можете построить
Построение обработки ошибок API производственного уровня
Разработать обработку ошибок для нового REST API, который возвращает согласованные ответы об ошибках с правильными HTTP-кодами состояния, кодами ошибок и полезными сообщениями для потребителей API.
Добавление устойчивости к распределенным системам
Реализовать паттерны автоматического выключателя и повторных попыток для предотвращения каскадных сбоев, когда внешние сервисы становятся недоступными, обеспечивая плавную деградацию системы.
Улучшение обратной связи по код-ревью на тему обработки ошибок
Предоставлять конкретную, практически применимую обратную связь по обработке ошибок в pull request-ах, выявляя антипаттерны, такие как пустые блоки catch или слишком широкую обработку исключений.
Попробуйте эти промпты
Мне нужна обработка ошибок для функции на {language}, которая вызывает внешний API. Функция должна повторять попытки при сетевых сбоях с экспоненциальной задержкой, включать правильные типы ошибок и предоставлять понятные сообщения об ошибках для отладки.Разработать пользовательскую иерархию исключений для приложения типа {application_type}. Включить базовый класс исключения, конкретные типы ошибок для валидации, ситуаций 'не найдено' и сбоев внешних сервисов. Каждое исключение должно включать код ошибки, временную метку и соответствующий контекст.Реализовать паттерн автоматического выключателя для сервиса, который делает вызовы к ненадежному стороннему API. Включить конфигурацию для порога сбоя, длительности таймаута и полуоткрытого состояния для тестирования восстановления.
Создать систему валидации, которая собирает все ошибки валидации, а не завершается сбоем на первой. Показать, как агрегировать ошибки из нескольких полей и возвращать их структурированным ответом.
Лучшие практики
- Создавайте конкретные типы исключений с контекстной информацией, включая коды ошибок, временные метки и соответствующие метаданные для отладки
- Используйте типы Result или явные возвраты ошибок для ожидаемых сбоев, чтобы обработка ошибок была обязательной и видимой во время компиляции, где это возможно
- Реализуйте автоматические выключатели для внешних зависимостей для предотвращения каскадных сбоев и обеспечения плавной деградации
- Логируйте ошибки с соответствующим уровнем серьезности - уровень error для реальных проблем, warning для ожидаемых сбоев, никогда для нормального потока выполнения
Избегать
- Пустые блоки catch, которые молча проглатывают ошибки, скрывая баги и делая отладку невозможной
- Слишком широкие обработчики исключений, такие как `except Exception`, которые маскируют программные ошибки наряду с ожидаемыми сбоями
- Логирование исключений без их повторного выбрасывания, создающее дублирующиеся записи в логах и запутанный поток управления
- Возврат общих кодов ошибок вместо типизированных исключений, делающий обработку ошибок многословной и подверженной ошибкам
Часто задаваемые вопросы
Когда следует использовать исключения вместо типов Result?
Как спроектировать хорошую иерархию ошибок?
Что такое автоматический выключатель и когда его следует использовать?
Как следует обрабатывать ошибки в асинхронном коде?
Какую информацию следует включать в сообщения об ошибках?
Как эффективно тестировать обработку ошибок?
Сведения для разработчиков
Автор
wshobsonЛицензия
MIT
Репозиторий
https://github.com/wshobson/agents/tree/main/plugins/developer-essentials/skills/error-handling-patternsСсылка
main
Структура файлов
📄 SKILL.md