C++는 예외를 우선적으로 생각하는 언어가 아니다(JAVA는 예외 위주의 프로그램 언어)

 

예외 발생 1 - 범위 이탈

INDEX값 보다 size가 커서 발생되는 오류에 대해서는 프로그래머가 해결할 수 있는 문제며,

이 문제에 대해서 해결을 위해 예외처리를 하는 것은 예외처리를 남용하는 것!(예측가능 시는 if로 해결)

->예외처리란 어쩔 수 없는 문제에 대해 처리를 하기 위해 사용하는 키워드

 

예외 발생 2 - 0으로 나누기

C++에서는 예외가 아니다(단지, 정의되지 않은 값이라고 나옴)

if로 해결하는게 옳다

 

예외 발생 3 - NULL 개체

C++에서는 이것도 예외는 아니다!

if로 해결하는게 옳다

 

그럼 예외처리는 어디서 해야 옳은가???

 

예외 발생 4 - 생성자

생성자에서 변수에 new할당을 할 경우

mSlots = new int[count]; 를 했을 경우 만약 mSlots이 NULL이어서 할당이 안됐을 경우에

프로그램에서 예외를 반환해 줘야하지만 반환값이 존재하지 않아서 알릴 방법이 없음.

=>exception사용이 맞다.

 

C++에서 예외처리를 만드는 방식(좌) 사용법 (우)

 

예외처리를 생성자에서 많이 사용하지만 C++을 사용하는 업계는 성능을 중시하는 업계

->즉, 느려지기 때문에 예외처리 기능이 꺼있는게 대부분.

메모리 부족으로 NULL이 나오는 경우????

->메모리가 부족해서 NULL이 나왔는데 재호출??? 소용없는 방식

->프로그램의 종료?? 프로그램 크래시와 다를게 없는데 소용이 있는 방식인가???

=논리적으로는 가능하지만 상식적으로는 불가능한 일이라고 봐도 무방하다.

또한, 예외처리로인한 호출로 스택을 재정비해야하기 때문에 느려진다.

 

C++도 예외처리는 가능하다!

 

cin.fail()을 이용한 예외처리 방식

->exception을 던지는 것은 전역함수처리 느낌이다.

->cin.fail()을 사용하면 조금 더 캡슐화 되어 처리가 가능하다.

 

1.에러코드는 가독성이 떨어진다.

- 실제로는 에러코드를 exception으로 던지는 것과 if로 처리하는건 큰 차이가 없다.

오히려 if 문의 로직을 잘 돌려서 구성하면 가독성을 보장할수있다.

즈, 에러코드는 예외처리 못지 않게 가독성이 높으며 오히려 더 높을 수도있다. 처리하는 방식차이다.

 

2.예외는 코드 유지보수를 쉽게 만든다.

3.예외는 더 코드를 안전하고 탄탄하게 만든다.

- 예외처리를 열심히 한다고 큰 차이가 없을 수 있다.(대부분 예외처리를 제대로 못한다.)

우리가 사용하는 튼튼한 프로그램인 운영체제는 실제로 C로 만들었다.(C는 예외처리에 좋은 프로그램이 아니다.)

왜? C를 쓸까?? 프로그래머들도 사실은 알고있었을지도..??

 

예외 안전성이란????

예외를 만났을 경우 해결하고 코드가 정상적으로 복구한다는 것.

-정말 쉽지않다. 길이 하나면 사람이 따라서 읽지만 길이 10개만 되도 분기점이 너무 많지 않은가..

 

그나마 예외처리를 열심히하는 JAVA에서는 함수 헤더에 exception을 작성하여 최대한 예외처리를 처리하지만

현재 동향으로는 JAVA도 한 번에 처리를 하는 추세다. =>너무 처리가 어렵기 때문에.

 

하지만 예외처리를 아에 안쓸수는 없다!!

그럼 언제 사용을 해야하냐???

1.내가 제어 할 수 있는 상황은 예외가 아니다! 경계 밖(외부)에서 오는 데이터에 대해서는 예외처리를 해야한다.

-외부에서 오는 데이터는 제어 불가능

2.시스템에 들어오는 데이터는 올바르다고 간주해야한다.

-assert를 사용하여 개발 중 문제 해결

3.예외 상황 발생시 NULL을 능동적으로 사용

-기본적으로 함수가 NULL반환 or 받는 일은 없어야하며, 함수가 NULL을 반환 or 받는다면 함수 이름을 잘 지어야함

 

조금 더 안정적인 코드를 위해

1.매개변수가 NULL을 처리할 수 있다면 이름 뒤에 OrNull을 붙여라

2.함수가 NULL을 반환할 수 있다면 이름 뒤에 OrNull을 붙여라

3.예외를 너무 믿지마라

-예외 처리를 너무 신경썼지만 로직이 잘못돼면 예외도 틀렸을 가능성이 높다.

-예외 처리보다 철저한 테스트 계획을 통해 해결하자

 

라이브 서버에서 예외처리를 통한 버그잡기X

- 개발 중 코드에서 assert를 통한 버그 잡기가 맞다.

 

예외가 없는 경우

-프로그램 크래시 발생->크래시에서 메모리 덤프 발생->개발자는 덤프 파일을 보고 당시 상황을 파악/디버깅 - 해결

예외가 있는 경우

-왼쪽의 어느 것도 안 할 확률 높음 printf로 작성한 로그를 보면서 디버깅..(오래걸림)

->문제가 나타났을 때 바로 고치기 힘듦.

 

C++ 13강 예외처리 마무리..

'C++' 카테고리의 다른 글

C++ 14일차  (0) 2021.06.30
C++ 13일차  (0) 2021.06.28
C++ 11일차  (0) 2021.06.23
C++ 10일차  (0) 2021.06.23
C++ 9일차  (0) 2021.06.21

+ Recent posts