[C++]오류 처리


7강

에러

프로그램에서 에러는 해당 프로그램을 중단시킵니다. 게임이 에러 때문에 실행되지 않는 것처럼. 에러는 프로그램의 실패입니다. 프로그램이 미처 예상치 못한 상황이 생겨서 대처하지 못한 결과입니다.
그렇다면 에러는 항상 나쁜 걸까요.

작은 프로그램을 생각해 보겠습니다. 예를 들면 숫자의 덧셈만 계산할 수 있는 작은 계산 프로그램입니다. 이때 숫자가 아닌 a + 2라는 값을 출력하라는 명령을 내리면 프로그램은 어떻게 반응해야 할까요. 에러를 출력하지 않고 어떻게 해결할까요.

a라는 값을 프로그램이 임의로 숫자로 바꾸어서 계산해 버릴 수도 있고, 은근슬쩍 무시하고 지나갈 수도 있습니다.
그러면 에러가 없는 프로그램이니 좋은 프로그램일까요?
그건 아닐 것 같습니다. 나중에는 더 큰 문제가 될 수도 있으니까요.

나쁜 에러는 예상하지 못한, 예상하지 않은 에러입니다. 경우를 나누어 일부러 에러를 발생시키는 것을 에러 출력이라고 합니다

에러 출력의 핵심

유틸리티 함수는 내부에 고정된 메시지를 포함하면 안됩니다. 유틸리티 함수는 상위 함수에서 필요한 기능 중 일부를 제공하기 때문에 모든 유틸리티 함수에서 고정 메시지를 출력하면 프로그램은 원치 않은 메세지들로 가득차게 될 테니깐. 따라서 에러를 출력은 메시지 전달보다 해당 기능을 중지해서 에러를 출력하는 게 더 중요하다.

  • 프로그램을 중단시킨다

오류의 종류

  1. 컴파일 에러
    • 문법 에러
    • 타입 에러
  2. 링커 에러
    • 참조 에러
  3. 런타임 에러
    • 컴퓨터 오류
    • 라이브러리 오류
    • 사용자 코드가 감지한 오류
  4. 논리 에러
    • 결과적으로 프로그래머가 원하지 않은 결과 인출.

오류 처리 방법

라이브러리 함수를 제공하는 쪽과 함수를 호출하는 쪽이 있다고 해보자.

  1. 함수를 제공하는 쪽에서 오류 처리
  2. 함수를 호출하는 쪽에서 오류 처리
  3. 함수를 제공하는 쪽에서 오류 처리 후 함수를 호출하는 쪽에서 원하는 방식으로 오류 처리
    • 제공하는 쪽과 호출하는 쪽에서 각각 오류 처리를 구분함.
    • 예외 처리 방식을 사용

실행시간 오류(런타임 에러)

  1. 잘못된 입력 오류
  2. 구간 오류
    • out of range 타입 오류
  3. 입력 오류

런타임 error 만들기

  • 우리는 런타임 에러만 다룰 수 있다. 그 이전에 일어나는 컴파일에러와 링커에러는 손댈 수 없다.
void error(string s)
{
    throw runtime_error(s);
}

이런식으로 런타임 에러 함수를 생성할 수 있다.


int main()
{
    try
    {
        if(1) throw runtime_error("에러 테스트");
    }
    catch(runtime_error& e)
    {
        cerr << "runtime_error: " << e.what() << '\n';
        keep_window_open();
    }
}

throw는 에러를 던지는 것인데 try catch구문을 사용해서 처리하는 데 적합하다.
try 안에서 throw를통해서 에러를 던지면 프로그램이 종료되는 것이 아니라 catch에서 에러를 잡아서 처리할 수 있다.

  • 즉 2가지 단계로 구분하면서 에러를 더 유연하게 처리할 수있다.
  • cerr은 에러를 처리하기에 cout보다 더 적합하다는 점을 빼면 cout과 동일하다.
  • 에러 타입에서 .what() 메소드는 에러에 저장된 오류메시지를 가져온다.
  • 여러 에러를 한꺼번에 처리하고 싶을 때는 catch(...)을 사용한다.
try{
    // ...
} catch (exception& ex) {
    // ...
} catch (string& ex) {
    // ...
} catch (...) {
    // ...
}
  • 위에서는 exception 타입으로 처음 에러를 걸러내고 그다음은 string 타입 에러를 잡아내고 나머지 에러를 한번에 처리함을 볼 수 있다.





© 2017. by yunsu

Powered by dolphin