예외 처리와 링크 지정
2025년 12월 04일 09시
카테고리 -
LECTURE,
객체지향프로그래밍II
객체지향프로그래밍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 이름 규칙으로 목적 코드를 생성할 것을 지시
- 사용법
- 함수 하나만 선언
- 여러 함수들 선언
- 헤더파일 통째로 선언