스킬 error-handling-patterns
📦

error-handling-patterns

안전

강력한 에러 처리 패턴 구현

애플리케이션은 종종 부실한 에러 처리로 인해 예기치 않게 실패합니다. 이 스킬은 Python, TypeScript, Rust, Go에서 예외 처리, Result 타입, 서킷 브레이커, 그리고 우아한 성능 저하를 위한 실전 검증된 패턴을 제공합니다.

지원: Claude Codex Code(CC)
🥉 72 브론즈
1

스킬 ZIP 다운로드

2

Claude에서 업로드

설정 → 기능 → 스킬 → 스킬 업로드로 이동

3

토글을 켜고 사용 시작

테스트해 보기

"error-handling-patterns" 사용 중입니다. 파일을 읽고 JSON 콘텐츠를 파싱하는 함수에 에러 처리를 추가하세요.

예상 결과:

다음은 적절한 에러 계층 구조를 사용한 강력한 파일 처리 패턴입니다:

**Python 예제:**
```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
```

**주요 관행:**
- 다양한 에러 시나리오에 대해 특정 예외 타입 사용
- 예외에 컨텍스트 정보 포함
- 원본 스택 트레이스를 보존하기 위해 예외 체인 사용
- 자동 리소스 정리를 위한 컨텍스트 매니저 사용

"error-handling-patterns" 사용 중입니다. 여러 서비스를 병렬로 호출하는 async 함수에서 에러를 어떻게 처리해야 하나요?

예상 결과:

병렬 서비스 호출의 경우 다음 전략을 고려하세요:

**옵션 1: 에러 집계**
첫 번째 에러에서 실패하는 대신 모든 에러를 수집하고 함께 보고합니다.

```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 };
}
```

**옵션 2: Result 타입**
각 작업에 대해 명시적인 성공/실패 타입을 사용합니다.

```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" 사용 중입니다. 피해야 할 가장 나쁜 에러 처리 안티 패턴은 무엇인가요?

예상 결과:

다음은 가장 위험한 안티 패턴과 해결 방법입니다:

**안티 패턴 1: 빈 Catch 블록**
```python
try:
do_something()
except:
pass # Silent failure - bugs hide forever
```
**해결 방법:** 항상 예외를 로깅하거나 다시 발생시키세요.

**안티 패턴 2: 지나치게 광범위한 예외 처리**
```python
try:
do_something()
except Exception:
# Hides bugs including typos and logic errors
pass
```
**해결 방법:** 특정 예외 타입만 캐치하세요.

**안티 패턴 3: 로깅 후 에러 삼키기**
```python
try:
do_something()
except Exception as e:
logger.error(e)
# Error logged but not handled - caller doesn't know it failed
```
**해결 방법:** 에러를 다시 발생시키거나 에러 결과를 반환하세요.

**안티 패턴 4: 지나치게 일반적인 에러**
```python
raise Exception("Error occurred") # No context, no code, useless for debugging
```
**해결 방법:** 무슨 일이 일어났는지, 무엇을 처리 중이었는지, 에러 코드를 포함하세요.

보안 감사

안전
v5 • 1/21/2026

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.

2
스캔된 파일
1,236
분석된 줄 수
0
발견 사항
5
총 감사 수
보안 문제를 찾지 못했습니다
감사자: claude 감사 이력 보기 →

품질 점수

38
아키텍처
100
유지보수성
87
콘텐츠
41
커뮤니티
100
보안
87
사양 준수

만들 수 있는 것

프로덕션급 API 에러 처리 구축

적절한 HTTP 상태 코드, 에러 코드, API 사용자를 위한 유용한 메시지를 포함한 일관된 에러 응답을 반환하는 새로운 REST API의 에러 처리를 설계합니다.

분산 시스템에 복원력 추가

외부 서비스를 사용할 수 없게 될 때 연쇄 장애를 방지하기 위해 서킷 브레이커 및 재시도 패턴을 구현하여 시스템이 우아하게 성능을 저하하도록 보장합니다.

에러 처리에 대한 코드 리뷰 피드백 개선

풀 리퀘스트의 에러 처리에 대해 구체적이고 실행 가능한 피드백을 제공하여 빈 catch 블록이나 지나치게 광범위한 예외 처리와 같은 안티 패턴을 식별합니다.

이 프롬프트를 사용해 보세요

기본 에러 처리 구현
외부 API를 호출하는 {language} 함수에 대한 에러 처리가 필요합니다. 함수는 네트워크 장애 시 지수 백오프로 재시도하고, 적절한 에러 타입을 포함하며, 디버깅을 위한 명확한 에러 메시지를 제공해야 합니다.
커스텀 예외 계층 구조 설계
{application_type} 애플리케이션을 위한 커스텀 예외 계층 구조를 설계하세요. 기본 예외 클래스, 유효성 검사를 위한 특정 에러 타입, 찾을 수 없음, 외부 서비스 장애를 포함하세요. 각 예외는 에러 코드, 타임스탬프, 관련 컨텍스트를 포함해야 합니다.
서킷 브레이커 통합
신뢰할 수 없는 서드파티 API를 호출하는 서비스를 위한 서킷 브레이커 패턴을 구현하세요. 장애 임계값, 타임아웃 지속 시간, 복구 테스트를 위한 반개방 상태에 대한 구성을 포함하세요.
다중 에러 유효성 검사 집계
첫 번째 에러에서 실패하는 대신 모든 유효성 검사 에러를 수집하는 유효성 검사 시스템을 만드세요. 여러 필드의 에러를 집계하고 구조화된 응답으로 반환하는 방법을 보여주세요.

모범 사례

  • 디버깅을 위한 에러 코드, 타임스탬프, 관련 메타데이터를 포함한 컨텍스트 정보가 있는 특정 예외 타입 생성
  • 예상되는 실패에 대해 Result 타입 또는 명시적 에러 반환을 사용하여 가능한 경우 컴파일 시점에 에러 처리를 강제하고 가시화
  • 외부 종속성에 대해 서킷 브레이커를 구현하여 연쇄 장애를 방지하고 우아한 성능 저하 허용
  • 적절한 심각도로 에러 로깅 - 실제 문제는 에러 레벨, 예상된 실패는 경고, 정상 흐름은 절대 로깅하지 않음

피하기

  • 에러를 조용히 삼켜 버그를 숨기고 디버깅을 불가능하게 만드는 빈 catch 블록
  • 예상된 실패와 함께 프로그래밍 에러를 가리는 `except Exception`과 같은 지나치게 광범위한 예외 핸들러
  • 예외를 다시 발생시키지 않고 로깅하여 중복 로그 항목을 생성하고 제어 흐름을 혼란스럽게 만드는 것
  • 타입이 지정된 예외 대신 일반적인 에러 코드를 반환하여 에러 처리를 장황하고 오류가 발생하기 쉽게 만드는 것

자주 묻는 질문

예외와 Result 타입을 언제 사용해야 하나요?
네트워크 장애, 파일을 찾을 수 없음, 프로그래밍 버그와 같은 예기치 않은 예외적인 상황에는 예외를 사용하세요. 유효성 검사 에러, 속도 제한, 비즈니스 규칙 위반과 같은 예상되는 실패에는 Result 타입을 사용하세요. 예외는 제어 흐름을 방해하는 반면 Result 타입은 에러 처리를 명시적이고 강제적으로 만듭니다.
좋은 에러 계층 구조를 어떻게 설계하나요?
타임스탬프, 에러 코드, 컨텍스트와 같은 공통 필드를 캡처하는 기본 ApplicationError로 시작하세요. 각 에러 도메인에 대한 특정 하위 클래스를 생성하세요: ValidationError, NotFoundError, ExternalServiceError, AuthenticationError. 깊은 상속 계층을 피하세요 - 일반적으로 2-3 레벨이면 충분합니다.
서킷 브레이커란 무엇이며 언제 사용해야 하나요?
서킷 브레이커는 실패하는 서비스에 대한 요청을 중지하여 연쇄 장애를 방지합니다. 세 가지 상태가 있습니다: 폐쇄(정상 작동), 개방(요청이 즉시 실패), 반개방(복구 테스트). 반복적인 실패가 리소스를 고갈시키거나 사용자 경험에 영향을 줄 수 있는 모든 외부 서비스 호출에 사용하세요.
async 코드에서 에러를 어떻게 처리해야 하나요?
async/await 코드에서는 await 문 주위에 try/catch를 사용하세요. Promise 체인의 경우 항상 .catch() 핸들러를 추가하세요. 처리되지 않은 프로미스 거부에 주의하세요 - Node.js 프로세스를 충돌시킬 수 있습니다. 실패를 명시적으로 만들기 위해 비동기 작업에 Result 타입을 고려하세요.
에러 메시지에 어떤 정보를 포함해야 하나요?
시도된 작업, 입력 또는 리소스가 무엇이었는지, 왜 실패했는지, 사용자 또는 개발자가 이에 대해 무엇을 할 수 있는지 포함하세요. 민감한 데이터 노출을 피하세요. 프로그래밍 방식의 처리를 위해 에러 코드와 함께 구조화된 형식을 사용하세요.
에러 처리를 효과적으로 테스트하려면 어떻게 해야 하나요?
모킹을 사용하여 특정 실패를 트리거하여 각 에러 경로를 명시적으로 테스트하세요. 에러에 예상되는 컨텍스트와 코드가 포함되어 있는지 확인하세요. 일시적인 실패를 시뮬레이션하여 재시도 로직을 테스트하세요. 서킷 브레이커가 장애 조건에서 상태 간에 올바르게 전환되는지 확인하세요.

개발자 세부 정보

파일 구조

📄 SKILL.md