티스토리 뷰
- .NET은 전부 unchecked 예외
- 대신 예외 타입을 세분화해서 상황별 catch로 처리하는 게 기본
C#(.NET)에서 자주 쓰는 예외/에러 클래스
구분 | 대표 클래스 | 하위/관련 예외 | 설명 |
입력/인자 문제 |
ArgumentException | ArgumentNullException, ArgumentOutOfRangeException, FormatException |
잘못된 인자·누락·범위·포맷 오류 |
상태/로직 문제 |
InvalidOperationException | NotSupportedException, ObjectDisposedException |
잘못된 호출 시나리오/지원 안 함/폐기 후 사용 |
컬렉션/인덱스 | IndexOutOfRangeException | KeyNotFoundException | 인덱스·키 범위 초과/부재 |
런타임 연산 | DivideByZeroException | OverflowException | 수학 연산 오류/오버플로 |
참조/캐스팅 | NullReferenceException | InvalidCastException | null 역참조/잘못된 캐스팅 |
I/O 전반 | IOException | FileNotFoundException, DirectoryNotFoundException, PathTooLongException, EndOfStreamException, InvalidCastException |
파일/디렉터리/ 스트림 I/O 문제 |
네트워크/소켓 | SocketException | HttpRequestException, WebException(구) |
연결 실패/타임아웃/ 프로토콜, HTTP 호출 실패 |
쓰레딩/취소 | TaskCanceledException | OperationCanceledException, ThreadAbortException |
비동기 취소/스레드 강제 종료 |
보안/권한 | UnauthorizedAccessException | SecurityException | 파일·OS 권한/보안 정책 위반 |
데이터/ 직렬화 |
JsonException (System.Text.Json) |
SerializationException | JSON 파싱/직렬화 오류 |
데이터베이스 | (공통 표준 없음) | SqlException (System.Data.SqlClient), DbUpdateException(EF Core) |
DB 연결/쿼리/제약 위반/ 업데이트 실패 |
환경/자원 | OutOfMemoryException | StackOverflowException | 메모리 부족/스택 초과(치명적) |
참고: .NET에서 ApplicationException을 쓰지 않는 게 권장된다(의미가 약함).
C# 예외 처리 가이드라인 (상황 → 전략 매핑)
상황 | 대표 예외(예시) | 심각도/복구성 | 기본 처리 전략 | 외부 응답 (HTTP) |
로그 레벨 | 메트릭/ 알림 |
비고 |
파싱/ 포맷 오류 |
JsonException, FormatException |
낮음 / 복구 가능 |
에러 위치·필드 제공 | 400 | WARN | 파싱 실패율 | 요청 바디 문제 |
인증 실패 | (미들웨어) | 낮음 / 복구 가능 |
재인증 유도 | 401 | INFO~WARN | 인증 실패율 | 민감정보 로그 금지 |
인가 실패 | (미들웨어) | 낮음 / 복구 가능 |
권한 오류 반환 | 403 | INFO~WARN | 권한 실패율 | |
비즈니스 규칙 위반 | 커스텀 BusinessException | 보통 / 재시도 무의미 |
도메인 코드·메시지로 응답 | 409 또는 422 |
INFO~WARN | 도메인 실패율 | 재고 없음/잔액 부족 |
네트워크 일시 장애 | HttpRequestException, SocketException |
보통 / 재시도 가능 |
지수 백오프·회로차단기·폴백 | 502/ 503/ 504 |
WARN | 외부 의존성 에러율·지연 | Polly로 재시도/서킷 |
네트워크 영구 실패 | 지속 HttpRequestException(DNS), 4xx | 보통 / 재시도 무의미 |
즉시 실패·설정 점검 | 502/ 503 |
ERROR | 연속 실패 알람 | 구성/시크릿 오류 가능 |
외부 Rate Limit |
(HTTP 429) | 낮~보통 / 재시도 가능 |
Retry-After 준수, 큐잉 | 429 | WARN | 429 비율 | |
DB 제약 위반 |
DbUpdateException (EF Core 내부에 SqlException) |
보통 / 재시도 무의미 |
도메인 오류로 변환 | 409/ 422 |
INFO~WARN | 제약 위반 카운트 | 중복/순서 이슈 |
DB 데드락/ 타임아웃 |
SqlException (deadlock) |
보통 / 재시도 가능 |
짧은 백오프 재시도 | 503 (외부) / 200 (내부 재시도 성공) |
WARN | 데드락 건수 | 격리수준/인덱스 점검 |
커넥션 풀 고갈 | SqlException | 높음 / 조건부 복구 |
배압·상한·서킷 오픈 | 503 | ERROR | 즉시 알람 | 리크/풀 사이즈 점검 |
파일 I/O/ 디스크 가득 |
IOException, UnauthorizedAccessException |
높음 / 조건부 복구 |
쓰기 중단·읽기 전용 전환 | 507/ 500 |
ERROR | 디스크 사용률 알람 | 로테이션/정리 필요 |
동시성/용량 | TaskCanceledException, RejectedByPolicy(Polly) |
보통 / 설계 이슈 |
큐/스레드 제한, 배압 | 503 | WARN~ERROR | 거절률 | 용량 계획 |
버그/NRE | NullReferenceException, IndexOutOfRangeException |
높음 / 비복구 |
Fail-fast, 에러 페이지, 알람 | 500 | ERROR | 즉시 알람 | 재현·패치 |
치명적 자원 | OutOfMemoryException, StackOverflowException |
치명적 / 비복구 | 프로세스 재시작, 덤프 | 500 | FATAL | 즉시 알람 | 사전 부하 테스트 |
정책에 따라 달라질 수 있음.
처리 규칙 요약(한 줄씩)
- 입력·파싱은 400 + 구체 메시지
- 도메인 위반은 409/422 + 비즈니스 에러코드
- 네트워크/외부 장애는 Polly 재시도 + 서킷 + 폴백
- DB 데드락은 짧은 재시도, 제약 위반은 도메인 에러 변환
- 풀/디스크 고갈은 배압/상한 + 즉시 알람
- 버그/NRE는 Fail-fast + 스택트레이스 + 핫픽스
- 로그는 4xx=WARN, 5xx=ERROR, 치명적=FATAL, 민감정보 금지
- traceId를 전 구간에 붙여 한 요청을 끝까지 추적
- SLA 타임아웃은 P95/P99 지표로 관리
- 재시도 경로에는 멱등성 키(Idempotency) 필수
'개발 노트 > 개발 가이드라인' 카테고리의 다른 글
Java 예외 처리 가이드라인 (1) | 2025.08.21 |
---|
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- bgsave
- implict titling
- 오차 최소화
- child subtree availability
- event streaming
- cpu i/o
- content availability
- kernel space
- Cesium
- Kafka
- b3dm
- implicit tiling
- redis bgsave
- transferto()
- tile availability
- user space
- sendfile()
- append only
- .b3dm
- 3d tiles 1.0
- 머신러닝
- z-order
- explicit tiling
- morton order
- event srource
- redis
- zero-copy
- z-order curve
- the unix timesharing system
- Live BMW
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
글 보관함