개발하는 리프터 꽃게맨입니다.

[C++] 예외처리 본문

언어/C, C++

[C++] 예외처리

파워꽃게맨 2024. 1. 9. 12:19

C++ 예외 처리

C++ 에는 예외처리를 지원하긴 하지만 엄청 중요하게 다루지는 않습니다.

예외처리를 꼼꼼하게 하기는 어려울 뿐더러 예외처리는 속도가 느리기 때문이죠.

 

실제로 예외처리 구문에 대한 디스어셈블리를 살펴보면 코드가 엄청 많이 생성된 것을 볼 수 있습니다.

 

C++가 속도를 중요시하는 언어인 만큼

예외 처리보다는 assert 나 if 문으로 처리하는 것이 가독성면에서나 속도면에서나 이득이라는 것이죠.

 

프로그래밍하면서 가장 많이 발생하는 오류는

범위 이탈(out of range)와 nullptr 참조겠죠?

이들은 모두 if 한 줄로 처리 가능합니다.

 

동적 할당시 메모리 부족 문제도 if 문으로 처리가 가능하구요.

 

그래서 대부분의 상황에서는 예외처리는 불필요할 뿐더러, 에러코드를 사용하는 방법이 더 낫습니다.

 

예외처리를 언제 써야하나?

1) 외부에서 받아서 사용하는 데이터 (라이브러리, 외부 파일 읽기/쓰기 등..) 에 대해서만 예외처리를 수행합니다.

 

2) 함수나 프로그램에 들어온 데이터는 다 올바르다고 가정하고, assert를 사용해서 개발 도중에 문제를 잡아내는 것이 더 좋습니다.

 

3) NULL을 능동적으로 사용하여, 오류 상황인지 아닌지를 수시로 체크하도록 합시다.

특정 함수가 NULL을 반환하거나 NULL을 매개변수로 받을 경우 함수이름을 잘 지어주면 가독성이 늘어납니다.

 

예외는 만병통치약이 아닙니다.

오히려 예외처리로 인해서 프로그램이 오류가 있음에도 좀비처럼 계속 돌아갈 가능성이 높습니다.

그래서 차라리 assert로 크래시를 내어서 프로그램을 고치도록 하는 것이 더 났습니다.

 

좋은 소프트웨어는 예외처리를 잘 해서 만들어지는 것이 아니라

철저한 테스트를 통한 디버깅으로 인해 만들어집니다.

 

assert 를 많이 이용하자

저는 개발하는데 있어서 오류를 잡아내기 위해 assert를 상당히 많이 사용합니다.

 

오류가 생기면 프로그램이 바로 뻗어 버리는 것이죠.

 

 

assert는 이런 식으로 사용합니다.

assert는 내부 조건문이 true인 경우 다음 문장을 실행하고

false인 경우 프로그램을 종료시킵니다.

 

그러면 assert 내부 조건에는 (이러이러한 조건일 경우에만 통과) 라고 이해하시면 되겠죠?

 

이런 assert의 경우 실패하면 올바른 호출 스택을 볼 수 있기에 디버그가 매우 변합니다.

그렇기에 저는 assert를 굉장히 많이 사용하는 편입니다.

 

 

위 코드는 이런 식의 오류가 뜨면서 크래시가 납니다.

이런 식으로 크래시를 유도하면 디버깅하는데 상당히 유용합니다.

'언어 > C, C++' 카테고리의 다른 글

[C/C++] 함수 포인터, 함수 객체, std::function  (0) 2024.01.16
[C++] 템플릿 기본  (0) 2024.01.15
[C++] static 에 대해서  (1) 2024.01.08
[C++] 인라인 함수  (1) 2024.01.08
[C++] 캐스팅 4총사  (1) 2024.01.08