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; }
{
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` 직접 상속 권장
작성자:
김수현 [비회원]
| 작성일자: 1년 전
2024-09-09 08:38:58
조회수: 166 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 166 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.