[C++] 예외처리
C++ 에서 <limits> 를 include하면 특정 데이터 타입이 표현할 수 있는 최대 / 최소 범위를 구할 수 있다.
int 나 long 타입으로 변수를 지정하고, 해당 데이터 타입이 표현할 수 있는 수를 넘어선 수를 저장하면 어떻게 될까?
코드를 실행하는 환경에 따라 다르지만, 이 경우는 undefined behavior이다. (언어에 정의 돼 있지 않다)
unsigned의 경우는 좀 다르다. undefined behavior가 아니다.
unsigned의 경우 표현할 수 있는 수를 넘어선 수는 wrap around로 처리된다.
unsigned 데이터 타입을 다루지 않는 경우 항상 undefined behavior에 의존해서 프로그램을 작성할 수 없으니 오버플로우나 언더플로우가 발생할 수 있는 연산은 연산 전에 체크해 줘야 한다.
1. Wrap Around
max + 1 = min
min - 1 = max
unsigned 의 semantic이다.
2. Saturation
오버플로우나 언더플로우 발생 시 해당 자료형의 max / min 값으로 지정한다.
머신러닝 모델에서 자주 사용된다.
3. 사용자 지정
말 그대로.. 어떻게 처리할 지 사용자가 지정한다.
여러 연산이 중첩되는 경우 연산 순서에 집중하고 연산 중간중간에 예외가 발생하는지 확인해 줘야 한다. (오류 방지)
C에서는 exception을 처리하는 요소가 딱히 없어 return으로 에러를 알려줬지만, C++에서는 throw를 사용해 exception을 던질 수 있다.
자바에서는 throwable 인터페이스를 구현한 객체들만 throw로 던질 수 있지만, C++에서는 객체든 primitive type이든 표현식이기만 하면 throw 할 수 있다. (void는 불가능)
예외가 던져지면 가장 근접한 try-catch 블록을 찾고 이동한다. (이동 경로에 있는 코드는 무시한다)
try-catch 를 찾지 못해 main 까지 가게 되면 프로그램이 uncaughted exception을 뱉고 죽는다.
C++에서도 몇 가지 예외는 자바처럼 정의되어있다.
exception class hierarchy로 부모 예외는 자손 예외를 모두 catch 할 수 있다.
자바의 Exception 처럼 모든 예외를 한 번에 잡을 때는 catch(...) 을 사용하면 된다. (변수에 예외 정보를 저장 할 수는 없다)
문자열은 const char * 로 인식된다.
예외 처리 부분에서 자바와 C++이 지향하는 바가 다름을 다시 한 번 확인할 수 있다.
자바에서는 Checked Exception으로 throws IOException 과 같이 해당 함수를 실행할 때 해당 에러를 던진다는걸 명시하지만, C++에서는 반대로 noexcept 키워드를 사용해 예외를 던지지 않음을 명시한다.
noexcept를 사용하면 성능이 향상된다.
noexcept 써 놓고 안에서 throw 시 컴파일은 성공하지만, throw 하는 순간 예외를 던지고 프로그램이 죽는다.
항상 throw를 한다는 보장이 없어서 이렇게 설계됐고, 당연히 noexcept 에러도 try-catch로 잡아 줄 수 있다.
'Programming Language > C++' 카테고리의 다른 글
[C++] Template (0) | 2022.12.17 |
---|---|
[C++] STL (0) | 2022.12.15 |
[C++] Design Pattern (0) | 2022.11.24 |
[C++] 정리 (1) (0) | 2022.11.23 |
[C++] OOP (5) Dynamic dispatch / Multiple Inheritance (0) | 2022.11.22 |
댓글
이 글 공유하기
다른 글
-
[C++] Template
[C++] Template
2022.12.17 -
[C++] STL
[C++] STL
2022.12.15 -
[C++] Design Pattern
[C++] Design Pattern
2022.11.24 -
[C++] 정리 (1)
[C++] 정리 (1)
2022.11.23