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

C++에서 사용자 정의 예외 클래스를 만드는 방법은?

_____
Q1: C++에서 사용자 정의 예외 클래스를 만드는 기본 방법은 무엇인가요?
A1: C++에서는 표준 예외 클래스(std::exception)를 상속받아 사용자 정의 예외 클래스를 만들 수 있습니다. 예외 클래스는 보통 `what()` 멤버 함수를 오버라이드하여 오류 메시지를 반환합니다.

```cpp
include
include

class MyException : public std::exception {
private:
std::string message;
public:
explicit MyException(const std::string& msg) : message(msg) {}

virtual const char* what() const noexcept override {
return message.c_str();
}
};
```

---

Q2: 왜 std::exception을 상속받아야 하나요?
A2: std::exception을 상속받으면 `catch` 문에서 표준 예외 처리 방식과 호환되며, 다른 예외들과 함께 일관된 방법으로 예외를 처리할 수 있습니다. 또한, `what()` 메서드가 표준화되어 있어 예외 메시지를 확인하기 쉽습니다.

---

Q3: 사용자 정의 예외 클래스에서 `what()` 함수는 어떻게 구현해야 하나요?
A3: `what()` 함수는 `const char*` 형식을 반환하며, `noexcept` 지정자를 포함해야 합니다. 보통 클래스 내부에 메시지를 저장하는 std::string 멤버를 두고 `c_str()`를 반환합니다.

```cpp
const char* what() const noexcept override {
return message.c_str();
}
```

---

Q4: 생성자에서 메시지 전달 방식은 어떻게 하나요?
A4: 예외에 대한 설명 메시지를 생성자 인자로 받아 내부 변수가 가리키도록 저장합니다. 일반적으로 `const std::string&` 또는 `const char*`를 매개변수로 받습니다.

---

Q5: 다중 예외 종류가 있을 때 사용자 정의 예외 구조는 어떻게 설계하나요?
A5: 기본 사용자 정의 예외 클래스를 만들고, 이를 상속받아 여러 예외 종류별 클래스를 만들 수 있습니다. 이렇게 하면 예외 유형별로 구체적인 메시지나 동작을 정의할 수 있습니다.

```cpp
class FileException : public MyException {
public:
explicit FileException(const std::string& msg) : MyException(msg) {}
};

class NetworkException : public MyException {
public:
explicit NetworkException(const std::string& msg) : MyException(msg) {}
};
```
---

Q6: 사용자 정의 예외를 던지고 처리하는 예시는 어떻게 되나요?
A6: 예외를 발생시킬 때는 `throw` 키워드로 객체를 던지고, `try-catch` 구문으로 처리합니다.

```cpp
try {
throw MyException("Custom error occurred");
} catch (const MyException& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
```

---

Q7: 사용자 정의 예외 클래스에서 추가 데이터를 저장할 수 있나요?
A7: 네, 메시지 외에도 에러 코드 등 추가 정보를 멤버 변수로 저장할 수 있으며, 멤버 함수를 통해 접근할 수 있습니다.

```cpp
class ErrorCodeException : public std::exception {
int code;
std::string message;
public:
ErrorCodeException(int c, const std::string& msg) : code(c), message(msg) {}

int getCode() const { return code; }

const char* what() const noexcept override {
return message.c_str();
}
};
```

---

Q8: noexcept 키워드가 꼭 필요한가요?
A8: C++11부터 `what()` 함수는 예외를 던지면 안 되므로 `noexcept`나 이전 버전에서는 `throw()` 사양을 붙이는 것이 권장됩니다. 안전한 예외 처리를 위해 필수적입니다.

---

Q9: 왜 std::string 대신 const char*를 멤버변수로 바로 저장하지 않나요?
A9: const char*는 문자열 복사가 아니라 단순 포인터이기 때문에, 원본 문자열이 사라지면 위험합니다. std::string을 사용하면 객체가 메시지를 안전하게 관리합니다.

---

Q10: std::runtime_error를 상속받아 사용자 정의 예외를 만드는 방법도 있나요?
A10: 네, std::runtime_error 클래스를 상속받으면 메시지를 생성자에 바로 넘겨줄 수 있어 편리합니다.

```cpp
include

class MyRuntimeException : public std::runtime_error {
public:
explicit MyRuntimeException(const std::string& msg) : std::runtime_error(msg) {}
};
```

이 경우 `what()` 함수는 std::runtime_error에서 이미 구현되어 있습니다.
C++에서 사용자 정의 예외 클래스를 만드는 것은 프로그램의 오류 처리 및 예외 관리를 보다 유연하고 명확하게 할 수 있는 좋은 방법입니다.

사용자 정의 예외 클래스를 만들면 특정한 오류 상황을 보다 잘 표현하고, 이를 통해 코드의 가독성과 유지보수성을 높일 수 있습니다.

아래에서는 사용자 정의 예외 클래스를 만드는 방법에 대해 자세히 설명하겠습니다.

1. 기본 예외 클래스 상속 C++에서 예외를 처리하기 위해서는 `std::exception` 클래스를 상속받아 사용자 정의 예외 클래스를 만들어야 합니다.

`std::exception` 클래스는 C++ 표준 라이브러리에서 제공하는 기본 예외 클래스입니다.

이를 상속받아 필요한 멤버 함수를 오버라이드하여 사용자 정의 예외를 구현할 수 있습니다.



2. 사용자 정의 예외 클래스 구현 아래는 사용자 정의 예외 클래스를 만드는 예제입니다.

```cpp include include include // 사용자 정의 예외 클래스 class MyException : public std::exception { private: std::string message; // 예외 메시지를 저장할 변수 public: // 생성자 MyException(const std::string& msg) : message(msg) {} // 예외 메시지를 반환하는 함수 virtual const char* what() const noexcept override { return message.c_str(); // std::string을 const char*로 변환하여 반환 } }; // 예외를 발생시키는 함수 void riskyFunction() { throw MyException("Something went wrong in riskyFunction!"); } int main() { try { riskyFunction(); // 예외가 발생할 수 있는 함수 호출 } catch (const MyException& e) { std::cerr << "Caught MyException: " << e.what() << std::endl; // 예외 처리 } catch (const std::exception& e) { std::cerr << "Caught std::exception: " << e.what() << std::endl; // 다른 예외 처리 } return 0; } ```

3. 코드 설명 1. 헤더 파일 포함 : ` include `과 ` include `을 통해 예외 처리와 문자열 처리를 위한 클래스를 포함합니다.



2. 사용자 정의 예외 클래스 : `MyException` 클래스를 정의하고, `std::exception`을 상속받습니다.

이 클래스는 예외 메시지를 저장하기 위한 `std::string` 타입의 멤버 변수를 가지고 있습니다.



3. 생성자 : 생성자는 예외 메시지를 인자로 받아서 멤버 변수에 저장합니다.



4. what() 함수 오버라이드 : `what()` 함수를 오버라이드하여 예외 메시지를 반환합니다.

이 함수는 `const char*` 타입을 반환해야 하므로, `std::string`의 `c_str()` 메서드를 사용하여 변환합니다.



5. 예외 발생 함수 : `riskyFunction()` 함수는 `MyException`을 발생시키는 예제 함수입니다.



6. 예외 처리 : `main()` 함수에서 `try-catch` 블록을 사용하여 예외를 처리합니다.

`MyException`을 먼저 잡고, 그 외의 다른 예외는 `std::exception`으로 처리합니다.



4. 사용자 정의 예외 클래스의 장점 - 명확한 오류 표현 : 특정한 오류 상황을 명확하게 표현할 수 있습니다.

- 유지보수성 향상 : 코드의 가독성이 높아지고, 오류 처리 로직을 보다 쉽게 이해할 수 있습니다.

- 확장성 : 필요에 따라 여러 개의 사용자 정의 예외 클래스를 만들어 다양한 오류 상황을 처리할 수 있습니다.



5. C++에서 사용자 정의 예외 클래스를 만드는 것은 프로그램의 오류 처리 및 예외 관리를 보다 효과적으로 수행할 수 있는 방법입니다.

위의 예제를 통해 사용자 정의 예외 클래스를 구현하고 사용하는 방법을 이해할 수 있습니다.

이를 통해 코드의 가독성과 유지보수성을 높이고, 다양한 오류 상황에 대해 보다 유연하게 대응할 수 있습니다.

작성자: 정지훈 [비회원] | 작성일자: 1년 전 2024-09-20 17:11:32
조회수: 130 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.