다른 프로그래밍 언어와 마찬가지로 C#에서도 개발자가 직접 사용자 정의 예외(User-defined Exception)를 손쉽게 만들 수 있습니다. 사용자 정의 예외 클래스는 .NET의 최상위 예외 클래스인 Exception 클래스를 상속받아 작성합니다.
기본 제공 예외만으로는 애플리케이션의 특정 상황을 표현하기 어려울 때, 이처럼 직접 예외 클래스를 정의하면 오류의 의미를 명확하게 전달할 수 있고 코드의 가독성과 유지보수성도 크게 향상됩니다.
사용자 정의 예외의 기본 구조
사용자 정의 예외를 만드는 방법은 매우 간단합니다. 핵심은 다음과 같습니다.
Exception클래스를 상속받는 새로운 클래스를 선언합니다.- 생성자에서
base(message)를 호출하여 예외 메시지를 부모 클래스에 전달합니다. - 필요한 시점에
throw문> 키워드로 해당 예외를 발생시킵니다.
아래 예제에서 생성되는 TempIsZeroException은 C#에 내장된 예외가 아니라, 온도가 0도일 때 발생하도록 직접 정의한 사용자 정의 예외입니다.
예제 코드
using System;
namespace Demo {
class TestTemperature {
static void Main(string[] args) {
Temperature temp = new Temperature();
try {
temp.showTemp();
} catch(TempIsZeroException e) {
Console.WriteLine("TempIsZeroException: {0}", e.Message);
}
Console.ReadKey();
}
}
}
public class TempIsZeroException: Exception {
public TempIsZeroException(string message): base(message) {
}
}
public class Temperature {
int temperature = 0;
public void showTemp() {
if(temperature == 0) {
throw (new TempIsZeroException("Zero Temperature found"));
} else {
Console.WriteLine("Temperature: {0}", temperature);
}
}
}코드 설명
- TempIsZeroException 클래스:
Exception을 상속받아 정의된 사용자 정의 예외입니다. 생성자에서 문자열 메시지를 받아base(message)로 전달합니다. - Temperature 클래스: 온도 값을 저장하고,
showTemp()메서드에서 온도가 0이면throw문으로TempIsZeroException을 발생시킵니다. - Main 메서드:
try-catch문> 블록으로 예외를 처리하며, catch 블록에서 예외 객체의Message속성을 출력합니다.
실행 결과
TempIsZeroException: Zero Temperature found
온도 값이 0이므로 showTemp() 메서드가 실행될 때 사용자 정의 예외가 발생하고, catch 블록에서 정의한 메시지가 그대로 출력되는 것을 확인할 수 있습니다.
마무리
이처럼 C#에서는 Exception 클래스를 상속하는 것만으로 간단히 사용자 정의 예외를 만들 수 있습니다. 비즈니스 로직에 특화된 오류 상황(예: 잔액 부족, 유효하지 않은 입력값 등)을 처리할 때 사용자 정의 예외를 활용하면, 오류 원인을 더 명확하게 표현하고 디버깅과 로깅에도 큰 도움이 됩니다.