2026년 상식닷컴 선정 식당 & 카페 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요

C#에서 커스텀 예외 클래스를 만드는 방법은?

_____
Q1: C 에서 커스텀 예외 클래스를 만드는 기본 방법은 무엇인가요?
A1: System.Exception 클래스를 상속받아 새 클래스를 정의합니다. 일반적으로 기본 생성자, 메시지를 받는 생성자, 내부 예외를 포함하는 생성자를 구현합니다.

```csharp
using System;

public class MyCustomException : Exception
{
public MyCustomException() { }

public MyCustomException(string message) : base(message) { }

public MyCustomException(string message, Exception innerException)
: base(message, innerException) { }
}
```

---

Q2: 커스텀 예외에 직렬화(Serialization) 기능도 추가해야 하나요?
A2: 예외가 원격 프로시저 호출이나 파일 저장 등에서 직렬화되어야 할 경우, `Serializable` 어트리뷰트를 추가하고 `protected` 생성자 및 `GetObjectData` 메서드를 오버라이드 하는 것이 좋습니다.

```csharp
[Serializable]
public class MyCustomException : Exception
{
public MyCustomException() { }
public MyCustomException(string message) : base(message) { }
public MyCustomException(string message, Exception inner) : base(message, inner) { }

protected MyCustomException(System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context)
: base(info, context) { }
}
```

---

Q3: 메시지 외에 추가적인 속성을 예외 클래스에 포함시켜도 되나요?
A3: 네, 가능합니다. 예외의 특수한 정보를 담기 위해 속성을 추가할 수 있으며, 직렬화를 위해 해당 속성을 `GetObjectData` 메서드에 반드시 포함해야 합니다.

```csharp
[Serializable]
public class MyCustomException : Exception
{
public int ErrorCode { get; }
public MyCustomException(int errorCode)
{
ErrorCode = errorCode;
}

public MyCustomException(string message, int errorCode) : base(message)
{
ErrorCode = errorCode;
}

protected MyCustomException(System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context) : base(info, context)
{
ErrorCode = info.GetInt32(nameof(ErrorCode));
}

public override void GetObjectData(System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context)
{
info.AddValue(nameof(ErrorCode), ErrorCode);
base.GetObjectData(info, context);
}
}
```

---

Q4: 커스텀 예외 클래스 이름 규칙이 있나요?
A4: 관례상 클래스 이름 끝에 “Exception”을 붙입니다. 예: `MyCustomException`, `DataNotFoundException`

---

Q5: 새로운 예외를 만들 때 `System.ApplicationException`을 상속하는 것이 좋은가요?
A5: 현재는 `ApplicationException`을 상속하는 것을 권장하지 않으며, 직접 `Exception`을 상속하는 것이 일반적입니다.

---

Q6: 커스텀 예외를 던질 때 어떤 점을 유의해야 하나요?
A6: 예외 메시지를 명확하게 하고, 필요한 경우 내부 예외를 포함하여 원인 추적이 가능하도록 만듭니다. 또한 예외를 너무 자주, 또는 예외 아닌 상황에 남발하지 않아야 합니다.

---

요약:
- `Exception`을 상속하여 커스텀 예외 생성
- `Serializable` 어트리뷰트를 붙이고 직렬화 생성자 및 `GetObjectData` 구현 권장
- 추가 속성 포함 시 직렬화 처리 필수
- 이름은 “Exception”으로 끝나도록 명명
- `ApplicationException` 상속 대신 `Exception` 직접 상속 권장
C 에서 커스텀 예외 클래스를 만드는 것은 특정한 오류 상황을 보다 명확하게 처리하고, 코드의 가독성을 높이며, 예외 처리 로직을 보다 세분화할 수 있는 좋은 방법입니다.

커스텀 예외 클래스를 만들기 위해서는 `System.Exception` 클래스를 상속받아 새로운 클래스를 정의해야 합니다.

아래에서는 커스텀 예외 클래스를 만드는 방법에 대해 단계별로 설명하겠습니다.

1. 커스텀 예외 클래스 정의하기 커스텀 예외 클래스를 만들기 위해서는 `System.Exception` 클래스를 상속받아야 합니다.

이 클래스는 기본적인 예외 처리 기능을 제공하며, 이를 통해 사용자 정의 예외를 생성할 수 있습니다.

```csharp using System; public class MyCustomException : Exception { public MyCustomException() { } public MyCustomException(string message) : base(message) { } public MyCustomException(string message, Exception innerException) : base(message, innerException) { } } ``` 위의 코드에서 `MyCustomException` 클래스는 `Exception` 클래스를 상속받고 있습니다.

세 개의 생성자를 정의하여 다양한 상황에서 예외를 생성할 수 있도록 하고 있습니다.

- 기본 생성자: 예외 메시지를 지정하지 않고 예외를 생성합니다.

- 메시지를 받는 생성자: 사용자에게 전달할 메시지를 지정할 수 있습니다.

- 메시지와 내부 예외를 받는 생성자: 다른 예외를 감싸는 형태로 예외를 생성할 수 있습니다.



2. 커스텀 예외 사용하기 커스텀 예외 클래스를 정의한 후, 이를 코드에서 사용할 수 있습니다.

예를 들어, 특정 조건에서 예외를 발생시키고 이를 처리하는 방법은 다음과 같습니다.

```csharp public class Example { public void DoSomething(int value) { if (value < 0) { throw new MyCustomException("Value cannot be negative."); } // 나머지 로직 } } ``` 위의 `DoSomething` 메서드는 `value`가 0보다 작을 경우 `MyCustomException`을 발생시킵니다.

이 예외는 호출하는 측에서 처리할 수 있습니다.



3. 예외 처리하기 커스텀 예외를 발생시킨 후, 이를 처리하는 방법은 다음과 같습니다.

```csharp public class Program { public static void Main(string[] args) { Example example = new Example(); try { example.DoSomething(-1); } catch (MyCustomException ex) { Console.WriteLine($"Custom Exception Caught: {ex.Message}"); } catch (Exception ex) { Console.WriteLine($"General Exception Caught: {ex.Message}"); } } } ``` 위의 `Main` 메서드에서는 `DoSomething` 메서드를 호출하고, `MyCustomException`이 발생할 경우 이를 잡아내어 적절한 메시지를 출력합니다.

일반적인 예외를 처리하기 위한 `catch` 블록도 추가하여, 다른 예외 상황에 대해서도 대비할 수 있습니다.



4. 추가적인 기능 커스텀 예외 클래스에 추가적인 속성을 정의하여 더 많은 정보를 제공할 수 있습니다.

예를 들어, 오류 코드나 관련 데이터를 추가할 수 있습니다.

```csharp public class MyCustomException : Exception { public int ErrorCode { get; } public MyCustomException(int errorCode, string message) : base(message) { ErrorCode = errorCode; } } ``` 이렇게 하면 예외를 발생시킬 때 오류 코드도 함께 전달할 수 있습니다.



5. C 에서 커스텀 예외 클래스를 만드는 것은 특정한 오류 상황을 보다 명확하게 처리하는 데 유용합니다.

커스텀 예외를 통해 코드의 가독성을 높이고, 오류 처리 로직을 세분화하여 유지보수성을 향상시킬 수 있습니다.

위에서 설명한 방법을 통해 필요에 맞는 커스텀 예외 클래스를 정의하고, 이를 활용하여 보다 견고한 애플리케이션을 개발할 수 있습니다.

작성자: 김수현 [비회원] | 작성일자: 1년 전 2024-09-09 08:38:58
조회수: 161 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.