※ LIG Nex1 The SSEN Embedded SW School에서 진행된 내용을 정리한 포스팅입니다.
예외 처리
- 컴파일 에러는 고마운 에러다.
- 런타임 에러로 프로그램이 종료되는 것은 치명적이다.
- 사용자 경험 측면에서도 좋지 않다.
- 에러가 발생했음을 알리고 프로그램이 지속되도록 하는 것이 좋다.
- 예외 처리의 3가지 키워드
- try/catch/throw
try
- try 블럭 안에서 발생한 예외만 처리할 수 있다.
- 함수 전체를 try로 묶을 수도 있지만 관련있는 코드끼리 한 블럭으로 묶는 것이 좋다.
- try 블럭에서 throw를 통해 예외의 발생을 catch 블럭으로 전달한다.
try {
/* code */
if (예외 발생 시)
throw expn;
/* code */
} caatch (type exn) {
/* 예외처리 */
}
- 예외가 가장 많이 발생하는 부분
- 입출력
- 메모리 할당
catch
- try 블럭에서 일어난 같은 타입의 예외만 받을 수 있다.
- 발생된 예외의 종류에 따라 처리 로직이 다른 경우 다른 타입의 예외를 받는 catch 블럭을 연결할 수 있다.
- catch 블럭에서 에러를 직접 처리하는 것은 어렵다.
- 에러를 즉각 수정하는 로직보다는 에러의 발생을 알리고 프로그램을 지속시키는 목적으로 사용된다.
stack unwinding
- try 블럭 내부에서 호출된 함수가 예외를 발생시키는 경우 예외 데이터가 catch 블럭을 만날 때까지 전달된다.
int main(void) {
try {
func1();
} catch (...) {
cerr << "error occurred" << endl;
}
}
void func1() {
func2();
}
...
void throw_error() {
throw new int(-1);
}
- throw 함수
- 함수에서 발생할 수 있는 예외를 명시적으로 나타낼 수 있다.
int throwError() throw (int, char) {
if (N == 1)
throw new int(1);
else
throw new char('Y');
}
예외 클래스와 예외 객체
- 예외 객체
- 예외가 발생했음을 알리는 객체
- 예외 클래스
- 예외 객체를 생성하기 위해 정의된 클래스
- 예외 객체를 통해 예외 발생에 대한 보다 구체적인 정보를 전달할 수 있다.
new 연산자에 의해 전달되는 예외
try {
while (true)
int *mem = new int[10000][10000];
} catch (bad_alloc& bad) {
cerr << "memory allocation error\n";
}
- bad_alloc과 같은 프로그래머가 정의하지 않은 예외가 발생하는 경우도 있다.
- dynamic_cast의 실패로 bad_cast 예외가 발생하기도 한다.
모든 예외를 처리하는 catch블럭
try {
/* code */
} catch (...) { // "..."는 전달되는 모든 예외를 모두 받는다.
/* code */
}
※ 질문, 개선점, 오류가 있다면 댓글로 남겨주세요 :)
'Language > C++' 카테고리의 다른 글
[TheSSEN/C++] 13. STL (0) | 2025.01.31 |
---|---|
[TheSSEN/C++] 12. 파일 입출력 (0) | 2025.01.31 |
[TheSSEN/C++] 10. 템플릿 (0) | 2025.01.29 |
[TheSSEN/C++] 9. 연산자 오버로딩 (0) | 2025.01.27 |
[TheSSEN/C++] 8. 다형성 (0) | 2025.01.27 |