모던 C# 개발: 커스텀 예외를 간단히 만들기
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에서 내부 예외 세부 정보를 노출하기
문제를 충분히 설명하는 내장 예외가 있다면, 이를 우선 사용하세요.
사용자 정의 예외를 만들기 전 체크리스트
- 이것이 실제 예외 상황을 나타내는가?
- 단순 메시지 문자열보다 의미를 더 추가하는가?
- 이름이 문제를 명확히 설명하고 있는가?
세 질문 모두 예라면, 사용자 정의 예외가 적합합니다.
결론
사용자 정의 예외는 코드의 가독성을 높이고 유지 보수를 쉽게 해 주는 작은 기능입니다. 적절히 사용하면 무엇이 잘못됐는지, 왜 그런지에 대한 간결한 이야기를 전달할 수 있습니다.