C#

C# 오류와 예외 처리, 그리고 HTTP 404/500 등 웹 오류 완전 정복

로기221 2025. 5. 27. 09:43
728x90
반응형

 

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 오류 코드를 함께 이해하면, 웹 애플리케이션의 신뢰성과 유지보수성을 크게 높일 수 있습니다.

728x90
반응형