C#에서 예외(Exception)는 클래스로 표현됩니다. C#의 예외 클래스들은 대부분 System.Exception 클래스를 직접 또는 간접적으로 상속받아 구성됩니다.
.NET이 제공하는 기본 예외 클래스 외에도, 개발자는 자신만의 사용자 정의 예외(User-defined Exception)를 만들 수 있습니다. 사용자 정의 예외 클래스는 Exception 클래스를 상속하여 정의하며, 이를 통해 애플리케이션의 도메인에 맞는 의미 있는 오류 정보를 전달할 수 있습니다.
사용자 정의 예외 작성 방법
사용자 정의 예외를 만드는 기본 절차는 다음과 같습니다.
Exception클래스를 상속하는 새 클래스를 선언합니다.- 생성자에서
base(message)를 호출해 예외 메시지를 부모 클래스에 전달합니다. - 필요한 시점에
throw> 키워드로 해당 예외를 발생시킵니다. try-catch블록에서 사용자 정의 예외를 잡아 처리합니다.
예제 코드
다음은 온도가 0일 때 발생시키는 TempIsZeroException이라는 사용자 정의 예외의 예입니다.
using System;
namespace UserDefinedException {
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);
}
}
}코드 설명
1. TempIsZeroException 클래스
TempIsZeroException은 Exception 클래스를 상속받는 사용자 정의 예외 클래스입니다. 생성자에서 문자열 매개변수 message를 받아 base(message)로 전달함으로써, 예외가 발생했을 때 Message 속성을 통해 오류 내용을 확인할 수 있습니다.
2. Temperature 클래스
Temperature 클래스의 showTemp() 메서드는 저장된 온도 값이 0이면 throw 문을 사용해 TempIsZeroException을 발생시키고, 그렇지 않으면 현재 온도를 콘솔에 출력합니다.
3. try-catch를 통한 예외 처리
Main 메서드에서는 try 블록 안에서 showTemp()를 호출하고, catch 블록에서 TempIsZeroException 타입으로 예외를 잡아 예외 메시지를 출력합니다.
실행 결과
위 프로그램을 실행하면 초기 온도 값이 0이므로 다음과 같은 결과가 출력됩니다.
TempIsZeroException: Zero Temperature found
정리
사용자 정의 예외를 활용하면 단순한 시스템 오류 코드 대신, 비즈니스 로직에 맞는 명확하고 읽기 쉬운 오류 메시지를 전달할 수 있습니다. 예외 이름과 메시지만 보고도 어떤 문제가 발생했는지 즉시 파악할 수 있도록, 프로젝트의 도메인 규칙에 맞는 예외 클래스를 설계하는 것이 좋은 C# 프로그래밍 습관입니다.