devRenio

예외 처리와 링크 지정

객체지향프로그래밍II(김정준) 14주차 강의내용

실행 오류의 종류와 원인

  • 오류
    • 컴파일 오류
      ◼ 문법에 맞지 않는 구문으로 인한 오류
    • 실행 오류
      ◼ 개발자의 논리 오류
      ◼ 예외적으로 발생하는 입력이나 상황에 대한 대처가 없을 때 발생하는 오류
    • 실행 오류의 결과
      ◼ 결과가 틀리거나 엉뚱한 코드 실행, 프로그램이 비정상 종료


예외

  • 예외란?
    • 실행 중, 프로그램 오동작이나 결과에 영향을 미치는 예상치 못한 상황 발생
      ◼ 예) getExp() 함수에 예상치 못하게 사용자가 음수를 입력하여 2^-3을 1로 계산한 경우
  • 예외 처리기
    • 예외 발생을 탐지하고 예외를 처리하는 코드
      ◼ 잘못된 결과, 비정상적인 실행, 시스템에 의한 강제 종료를 막음
  • 예외 처리 수준
    • 운영체제 수준 예외 처리
      ◼ 운영체제가 예외의 발생을 탐지하여 응용프로그램에게 알려주어 예외에 대처하게 하는 방식
      ◼ 운영체제마다 서로 다르므로, 운영체제나 컴파일러 별로 예외 처리 라이브러리로 작성
      ◼ Java의 경우, JVM 혹은 라이브러리에서 탐지한 예외를 자바응용프로그램에게 전달
      ◼ 윈도우 운영체제는 탐지한 예외를 C/C++ 응용프로그램에게 알려줌
      ◼ 운영체제와 컴파일러 의존적인 C++ 문법 사용
    • 응용프로그램 수준 예외 처리
      ◼ 사용자의 잘못된 입력이나 없는 파일을 여는 등 응용프로그램 수준에서 발생하는 예외를 자체적으로 탐지하고 처리하는 방법
      ◼ C++ 예외 처리
  • C++ 예외 처리
    • C++ 표준의 예외 처리
    • 응용프로그램 수준 예외 처리


C++ 예외 처리 기본 형식

  • try-throw-catch
    • try { } 블록
      ◼ 예외가 발생할 가능성이 있는 코드를 묶음
    • throw 문
      ◼ 발견된 예외를 처리하기 위해, 예외 발생을 알리는 문장
      ◼ try { } 블록 내에서 이루어져야 함
    • catch() { } 블록
      ◼ throw에 의해 발생한 예외를 처리하는 코드
try { // 예외가 발생할 가능성이 있는 실행문. try {} 블록
  예외를 발견한다면 {
    throw XXX; // 예외 발생을 알림. XXX는 예외 값
  }
  예외를 발견한다면 {
    throw YYY; // 예외 발생을 알림. YYY는 예외 값
  }
}
catch(처리할 예외 파라미터 선언) { // catch { } 블록
  // 예외 처리문
}
catch(처리할 예외 파라미터 선언) { // catch { } 블록
  // 예외 처리문
}


예외를 발생시키는 함수의 선언

  • 함수 원형에 연이어 throw(예외 타입, 예외 타입, …) 선언
  • 장점
    ◼ 프로그램의 작동을 명확히 함
    ◼ 프로그램의 가독성 높임


다중 try { } 블록

  • try { } 블록 내에 try { } 블록의 중첩 가능


throw 사용 시 주의 사항

  • throw 문의 위치
    • 항상 try { } 블록 안에서 실행되어야 함
      ◼ 시스템이 abort() 호출, 강제 종료
  • 예외를 처리할 catch()가 없으면 프로그램 강제 종료
  • catch() { } 블록 내에도 try { } catch() { } 블록 선언 가능


예외 클래스 만들기

  • 예외 값의 종류
    • 기본 타입의 예외 값
      ◼ 정수, 실수, 문자열 등 비교적 간단한 예외 정보 전달
    • 객체 예외 값
      ◼ 예외 값으로 객체를 던질 수 있다.
      ◼ 예외 값으로 사용할 예외 클래스 작성 필요
  • 예외 클래스
    • 사용자는 자신 만의 예외 정보를 포함하는 클래스 작성
    • throw로 객체를 던짐
      ◼ 객체가 복사되어 예외 파라미터에 전달


C++ 코드에서 C 코드의 링킹

  • 이름 규칙(naming mangling)
    • 컴파일 후 목적 코드에 이름 붙이는 규칙
      ◼ 변수, 함수, 클래스 등의 이름
  • C 언어의 이름 규칙
    • 이름 앞에 밑줄표시문자(_)를 붙인다.
      int f(int x, int y) -> _f
      int main() -> _main
  • C++의 이름 규칙
    • 함수의 매개 변수 타입과 개수, 리턴 타입에 따라 복잡한 이름
      int f(int x, int y) -> ?f@@YAHHH@Z
      int f(int x) -> ?f@@YAXH@Z
      int f() -> ?f@@YAHXZ
      int main() -> _main


extern “c”

  • extern “c”
    • C 컴파일러로 컴파일할 것을 지시
      ◼ C 이름 규칙으로 목적 코드를 생성할 것을 지시
  • 사용법
    • 함수 하나만 선언
    • 여러 함수들 선언
    • 헤더파일 통째로 선언