C# 오류와 예외 처리, 그리고 HTTP 404/500 등 웹 오류 완전 정복
C#에서 오류와 예외 처리 + HTTP 오류 코드(404, 500 등) 통합 설명
C#에서의 오류와 예외 처리 방법을 이해하는 것은 안정적인 애플리케이션 개발의 핵심입니다. 여기에 웹 개발 환경에서 자주 마주치는 404, 500 등 HTTP 오류 코드의 의미와 C#에서 이들을 처리하는 방법까지 함께 정리합니다.
C#에서 발생하는 오류의 종류
C#에서 오류(에러)는 크게 세 가지로 나눌 수 있습니다
- 문법 오류 (Syntax Error)
코드 작성 시 문법을 잘못 사용해서 발생하는 오류입니다. 대부분 컴파일 단계에서 발견되어 실행 자체가 되지 않습니다. - 런타임 오류 (Runtime Error)
프로그램 실행 중에 발생하는 오류입니다. 예를 들어, 0으로 나누기, 없는 파일 접근, 배열의 인덱스 초과 등이 있습니다. 이런 오류는 컴파일러가 잡아주지 못하고, 실행 중에 예외(Exception)로 발생합니다. - 알고리즘 오류 (Logic Error)
프로그램이 정상적으로 실행되지만, 논리적 실수로 인해 잘못된 결과가 나오는 경우입니다. 가장 찾기 어려운 오류이기도 합니다.
C#의 예외(Exception)와 예외 처리
C#에서 예외란, 프로그램 실행 중 발생한 예기치 않은 오류 상태를 의미합니다. 예외가 발생하면 프로그램은 기본적으로 즉시 종료되지만, try-catch-finally 구문을 사용하면 예외 상황에서도 프로그램이 안전하게 동작하도록 만들 수 있습니다.
try-catch-finally 기본 구조
try
{
// 예외가 발생할 가능성이 있는 코드
}
catch (Exception ex)
{
// 예외가 발생했을 때 처리할 코드
Console.WriteLine(ex.Message);
}
finally
{
// 예외 발생 여부와 관계없이 항상 실행되는 코드
}
- try: 예외가 발생할 수 있는 코드를 감쌉니다.
- catch: 예외가 발생했을 때 실행되는 블록입니다. 여러 개의 catch문을 사용해 다양한 예외를 구체적으로 처리할 수 있습니다.
- finally: 예외 발생과 상관없이 항상 실행되는 블록입니다. 리소스 해제 등에 주로 사용됩니다
C#에서 자주 발생하는 예외 종류
C#에서는 다양한 내장 예외 클래스가 제공되며, 대표적인 예외는 다음과 같습니다
예외 타입 | 설명 |
Exception | 모든 예외의 최상위 클래스 |
ArgumentException | 잘못된 인자를 전달했을 때 |
ArgumentNullException | 인자가 null일 때 |
ArgumentOutOfRangeException | 인자가 허용 범위를 벗어났을 때 |
ArithmeticException | 계산 오류(예: 0으로 나누기 등) |
DivideByZeroException | 0으로 나누었을 때 |
IndexOutOfRangeException | 배열 인덱스가 범위를 벗어났을 때 |
NullReferenceException | null 객체를 참조할 때 |
FileNotFoundException | 파일을 찾을 수 없을 때 |
FormatException | 형식이 잘못된 값을 처리할 때 |
InvalidCastException | 잘못된 형변환 시 |
OutOfMemoryException | 메모리 부족 |
HTTP 오류 코드(404, 500 등)와 C#에서의 처리
웹 개발에서는 HTTP 상태 코드로 오류를 구분합니다.
HTTP 오류 코드 표
코드 | 이름 | 의미/원인 |
400 | Bad Request | 잘못된 요청(문법 오류, 파라미터 오류 등) |
403 | Forbidden | 권한 없음, 접근 거부 |
404 | Not Found | 요청 리소스 없음, 잘못된 URL |
405 | Method Not Allowed | 허용되지 않은 HTTP 메소드 |
500 | Internal Server Error | 서버 내부 오류, 코드/설정/DB 문제 등 |
503 | Service Unavailable | 서버 과부하, 점검 중 |
예시: 404 vs 500 비교 표
구분 | 404 Not Found | 500 Internal Server Error |
원인 | 리소스 없음, URL 오류 등 | 서버 코드/설정/DB 등 내부 오류 |
책임 | 주로 클라이언트(사용자) | 서버(운영자, 개발자) |
해결책 | URL/리소스 확인, 캐시 삭제 | 서버 로그, 코드/설정 점검 |
404 Not Found
- 의미: 요청한 리소스(페이지, 파일 등)를 서버에서 찾을 수 없을 때 발생합니다.
- 주요 원인: 잘못된 URL, 리소스 삭제/이동, 서버에 리소스 없음.
- C#에서의 처리: ASP.NET Web API나 ASP.NET Core에서는 컨트롤러에서 예외를 발생시키거나, 직접 404 응답을 반환할 수 있습니다.
if (item == null) throw new HttpResponseException(HttpStatusCode.NotFound);
또는 -
return Request.CreateErrorResponse(HttpStatusCode.NotFound, "리소스를 찾을 수 없습니다.");
500 Internal Server Error
- 의미: 서버 내부에서 예기치 못한 오류가 발생해 요청을 처리할 수 없을 때 발생합니다.
- 주요 원인: 서버 코드 오류, 데이터베이스 연결 실패, 서버 자원 부족 등.
- C#에서의 처리: 예외가 catch되지 않고 전파되면 기본적으로 500 응답이 반환됩니다. 필요하다면 커스텀 예외 처리 필터를 통해 응답을 제어할 수 있습니다.또는 ASP.NET Core에서 커스텀 예외 필터를 만들어 처리할 수 있습니다
throw new Exception("서버 내부 오류 발생");
기타 자주 보는 HTTP 오류 코드
- 400 Bad Request: 잘못된 요청(문법 오류 등)일 때 반환.
- 403 Forbidden: 권한이 없어 접근이 거부된 경우.
- 405 Method Not Allowed: 허용되지 않은 HTTP 메소드 사용 시.
- 503 Service Unavailable: 서버가 일시적으로 과부하이거나 점검 중일 때.
C#에서 HTTP 오류 코드 응답 패턴
ASP.NET Web API나 ASP.NET Core에서는 컨트롤러에서 다음과 같이 HTTP 상태 코드를 명시적으로 반환할 수 있습니다.
// 404 Not Found
return NotFound("리소스를 찾을 수 없습니다.");
// 400 Bad Request
return BadRequest("잘못된 요청입니다.");
// 500 Internal Server Error
return StatusCode(500, "서버 내부 오류가 발생했습니다.");
또는 커스텀 예외 필터를 만들어 예외 발생 시 특정 HTTP 상태 코드와 메시지를 반환하도록 할 수 있습니다.
예외 처리의 모범 사례
- 예외는 반드시 필요한 경우에만 사용
예외 처리는 비용이 크기 때문에, 정상적인 흐름 제어용으로 남발하지 않는 것이 좋습니다. - 구체적인 예외부터 처리
여러 catch문을 사용할 때는, 구체적인 예외(자식 클래스)를 먼저, 범용적인 예외(부모 클래스)는 나중에 처리해야 합니다. - finally에서 리소스 해제
파일, 네트워크 등 리소스 해제는 finally 블록에서 처리하는 것이 안전합니다. - 사용자 정의 예외
필요하다면 Exception을 상속받아 사용자 정의 예외를 만들어 쓸 수 있습니다.
실전 예제: 다양한 예외 처리
try
{
int[] arr = new int[2];
arr[2] = 1234; // IndexOutOfRangeException 발생
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine("인덱스 범위를 벗어났습니다: " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("알 수 없는 오류 발생: " + ex.Message);
}
finally
{
Console.WriteLine("프로그램 종료");
}
이처럼 구체적인 예외부터 처리하고, 마지막에 Exception으로 모든 예외를 포괄적으로 처리할 수 있습니다!!
실전 예제: 다양한 예외 및 HTTP 오류 처리
try
{
var product = repository.Get(id);
if (product == null)
throw new HttpResponseException(HttpStatusCode.NotFound);
// 추가 로직
}
catch (HttpResponseException ex)
{
// ex.StatusCode에 따라 처리
}
catch (Exception ex)
{
// 500 Internal Server Error 등 기타 예외 처리
}
finally
{
// 리소스 해제 등
}
정리
- C#에서는 try-catch-finally 구문으로 예외를 처리하며, 다양한 내장 예외 클래스를 제공합니다.
- 웹 개발에서는 404, 500 등 HTTP 오류 코드를 통해 클라이언트와 서버 간의 문제를 명확히 구분합니다.
- ASP.NET(Web API, Core)에서는 예외를 직접 발생시키거나, 커스텀 예외 필터를 통해 HTTP 상태 코드와 메시지를 제어할 수 있습니다.
- 400번대 오류는 주로 클라이언트 문제, 500번대 오류는 서버 문제임을 기억하면 좋습니다.
마무리
C#에서 오류와 예외 처리는 안정적인 프로그램 개발을 위해 반드시 익혀야 할 필수 기술입니다. try-catch-finally 구문을 적극적으로 활용하고, 자주 발생하는 예외의 종류를 익혀두면 디버깅과 유지보수가 훨씬 쉬워집니다. 이처럼 C#의 예외 처리와 HTTP 오류 코드를 함께 이해하면, 웹 애플리케이션의 신뢰성과 유지보수성을 크게 높일 수 있습니다.