A Tour of C++ 4장
1. 할당된 작업을 수행할 수 없음을 나타내는 예외를 던진다
2. 예외는 오류 처리에만 사용한다
3. 파일을 여는 데 실패하거나 반복 끝에 도달하지 못하는 경우는 예상되는 실패이며 이례적이지 않다
4. 중간 호출자가 오류를 처리하리라 예상될 때는 오류 코드를 사용한다
5. 많은 함수 호출을 통할 것 같은 오류에는 예외를 던진다
6. 예외를 사용할지 오류 코드를 사용할지 불확실하면 예외를 사용한다
7. 디자인 초기에 오류 처리 전략을 세운다
8. 내장 타입이 아니라 목적에 맞게 디자인된 사용자 정의 타입을 예외로 사용한다
#include <iostream>
#include <exception>
#include <string>
// 사용자 정의 예외 클래스
class FileNotFoundException : public std::exception {
private:
std::string message;
public:
explicit FileNotFoundException(const std::string& file)
: message("파일을 찾을 수 없습니다: " + file) {}
// 예외 메시지를 반환
virtual const char* what() const noexcept override {
return message.c_str();
}
};
void openFile(const std::string& fileName) {
// 파일이 없다고 가정하고 예외 던짐
throw FileNotFoundException(fileName);
}
int main() {
try {
openFile("nonexistent.txt");
} catch (const FileNotFoundException& e) {
std::cerr << "예외 발생: " << e.what() << std::endl;
} catch (const std::exception& e) {
// 기타 예외 처리
std::cerr << "기타 예외 발생: " << e.what() << std::endl;
}
return 0;
}
자바에서 하던 것 처럼 exception을 사용자 정의 타입으로 만들어 사용한다.
9. 모든 함수에서 모든 예외를 잡으려 하지 말자
-> 함수 호출 계층을 잘 보고 적절히 처리하라는 뜻인듯하다.
10. 표준 라이브러리 예외 클래스 계층 구조를 사용하지 않아도 된다
11. 명시적 try 블록보다 RAII를 사용한다
-> RAII (생성자에서 자원할당, 소멸자에서 자원해제)
12. 생성자가 불변을 수립하게 하고 할 수 없으면 던진다
#include <iostream>
#include <stdexcept>
class PositiveNumber {
public:
// 생성자는 객체의 불변성을 확립함
// 입력값이 0 이하인 경우 예외를 던져, 잘못된 상태의 객체 생성을 방지함
PositiveNumber(int value) : value_(value) {
if (value <= 0) {
throw std::invalid_argument("양의 정수여야 합니다.");
}
}
int getValue() const {
return value_;
}
private:
const int value_; // 불변성을 유지하기 위해 const로 선언
};
int main() {
try {
PositiveNumber num(10); // 정상적인 경우
std::cout << "PositiveNumber: " << num.getValue() << std::endl;
PositiveNumber invalidNum(-5); // 예외가 발생하는 경우
} catch (const std::exception& e) {
std::cerr << "예외 처리: " << e.what() << std::endl;
}
return 0;
}
13. 불변에 대한 오류 처리 전략을 디자인한다
14. 컴파일 타임에 검사할 수 있는 것은 대개 컴파일 타임에 검사하는 것이 최선이다
#include <iostream>
// int의 크기가 4바이트임을 컴파일 타임에 검증
static_assert(sizeof(int) == 4, "int는 4바이트여야 합니다.");
int main() {
std::cout << "컴파일 타임 검사 성공: int의 크기는 4바이트입니다." << std::endl;
return 0;
}
static_assert를 사용하면 컴파일 타임에서 오류를 잡을 수 있다.
15. 어설션 메커니즘으로 실패를 의미하는 단일 제어 지점을 제공한다
-> assert는 디버그 모드에서 런타임 오류를 잡아낸다.
16. 콘셉트는 컴파일 타임 predicate이므로 주로 어설션에 유용하다
-> c++20의 내용 일단 패스
17. 함수가 던지지 않을 수 있으면 noexcept로 선언한다
18. noexcept를 함부로 적용하지 말자
-> noexcept는 해당 함수는 예외를 던지지 않는 다는 것으로 해당 함수에서 예외 발생 시 프로그램이 terminate된다.
예시는 gpt의 도움을 받아 작성했습니다
'C, C++ > C++ 여행' 카테고리의 다른 글
| [A Tour of C++] 7장 - 템플릿 (1) | 2025.06.10 |
|---|---|
| [A Tour of C++] 6장 - 필수 연산 (1) | 2025.05.17 |
| [A Tour of C++] 5장 - 클래스 (0) | 2025.05.14 |
| C++ 여행 조언 새기기 3 (1) | 2025.02.22 |
| C++ 여행 조언 새기기 2장 (0) | 2025.02.16 |