모던 C# 개발: 커스텀 예외를 간단히 만들기

발행: (2025년 12월 21일 오전 06:00 GMT+9)
4 min read
원문: Dev.to

Source: Dev.to

소개

오류는 발생합니다. 때로는 단순하고, 때로는 도메인에 매우 특화된 경우도 있습니다. C#은 많은 내장 예외를 제공하지만, 항상 전체 상황을 설명해 주지는 못합니다. 사용자 정의 예외를 사용하면 도메인‑특화 문제를 명확하게 전달할 수 있습니다.

사용자 정의 예외를 사용해야 할 때

사용자가 비즈니스 규칙을 위반하는 주문을 시도하는 주문 시스템을 생각해 보세요.

throw new InvalidOperationException("User cannot place this order");

내장 예외도 동작하지만, 메시지가 일반적입니다. 사용자 정의 예외는 더 많은 컨텍스트를 제공합니다:

throw new OrderNotAllowedException(userId);

기본 사용자 정의 예외 정의하기

사용자 정의 예외는 Exception을 상속받는 클래스일 뿐입니다.

public class OrderNotAllowedException : Exception
{
    public OrderNotAllowedException(string message)
        : base(message)
    {
    }
}

이 최소 버전만으로도 시작할 수 있습니다.

컨텍스트 정보 추가하기

모든 정보를 메시지 문자열에 담는 대신, 관련 데이터를 속성으로 노출합니다.

public class OrderNotAllowedException : Exception
{
    public Guid UserId { get; }

    public OrderNotAllowedException(Guid userId)
        : base($"User {userId} is not allowed to place an order")
    {
        UserId = userId;
    }
}

이제 로그와 오류 처리기가 UserId에 직접 접근할 수 있어 문자열 파싱이 필요 없고 디버깅이 간편해집니다.

.NET 버전 고려 사항

이전 .NET 버전(예: .NET Framework 4.x 및 그 이전)에서는 직렬화를 위해 추가 생성자를 구현하곤 했습니다. 최신 .NET(Core, 5+, 6+, 7+)에서는 위와 같은 간단한 클래스면 충분합니다.

사용자 정의 예외 남용 피하기

사용자 정의 예외는 유용하지만 오용될 수 있습니다. 다음을 피하도록 하세요:

  • 일반적인 흐름 제어에 예외 사용하기
  • 가치가 없는 매우 일반적인 사용자 정의 예외 만들기
  • 공개 API에서 내부 예외 세부 정보를 노출하기

문제를 충분히 설명하는 내장 예외가 있다면, 이를 우선 사용하세요.

사용자 정의 예외를 만들기 전 체크리스트

  1. 이것이 실제 예외 상황을 나타내는가?
  2. 단순 메시지 문자열보다 의미를 더 추가하는가?
  3. 이름이 문제를 명확히 설명하고 있는가?

세 질문 모두 라면, 사용자 정의 예외가 적합합니다.

결론

사용자 정의 예외는 코드의 가독성을 높이고 유지 보수를 쉽게 해 주는 작은 기능입니다. 적절히 사용하면 무엇이 잘못됐는지, 왜 그런지에 대한 간결한 이야기를 전달할 수 있습니다.

Back to Blog

관련 글

더 보기 »