14. 예외처리.

Slides:



Advertisements
Similar presentations
01_ 가상 함수를 사용한 다형성의 구현 02_ 오버라이딩
Advertisements

ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
ㅎㅎ C++ 프로그래밍의 첫 걸음 C++로 프로그래밍한다는 것의 의미 세상에서 가장 간단한 C++ 프로그램
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
C++ Espresso 제1장 기초 사항.
클래스 class, 객체 object 생성자 constructor 접근 access 제어 이벤트 event 처리.
제6장 객체배열과 벡터 객체 배열을 이해한다. 벡터(vector) 클래스를 사용할 수 있다.
명품 C++ 13장 예외 처리와 C 언어와의 링크 지정.
8. 객체와 클래스 (기본).
7장 배열 ②.
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
KIM HEESANG JDBC Programming 3 KIM HEESANG
Lesson 9. 예외처리.
5장. 참조 타입.
제 3장. C보다 나은 C++ II.
명품 C++ 7장 프렌드와 연산자 중복.
1. C++ 시작하기.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
C++ Espresso 제12장 템플릿.
명품 C++ 4장. 객체 포인터와 객체 배열, 객체의 동적 생성.
컴퓨터 프로그래밍 실습 #6 제 4 장 클래스 작성.
14장. 포인터와 함수에 대한 이해.
프로그램과 데이터의 구조화 Organizing programs and data
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
10장. 예외처리.
KIM HEESANG PL/SQL 2 KIM HEESANG
11장. 1차원 배열.
C#.
13. 연산자 오버로딩.
제14장 예외처리와 템플릿 예외 처리의 개요를 학습한다. 예외 처리를 적용할 수 있다. 템플릿의 개념을 이해한다.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
어서와 C언어는 처음이지 제14장.
명품 C++ 9장 가상 함수와 추상 클래스.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
제2장 제어구조와 배열 if-else 문에 대하여 학습한다. 중첩 if-else 문에 대하여 학습한다.
19. 함수 포인터와 void 포인터.
제 1장. C++ 시작하기.
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
01_ C++ 스타일의 입출력 02_ C 스타일의 입출력
4. 고급변수 사용 : 포인터와 관련하여 메모리 바라보기
10. 문자열클래스와파일클래스.
2장. 변수와 타입.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
5장 선택제어문 if 선택문 switch-case 선택문 다양한 프로그램 작성 조건 연산자.
Chapter 08. 함수.
C++ Espresso 제11장 예외 처리와 형변환.
멤버함수 중첩( 복사 생성자 ) - 연사자 중첩 - 동적 메모리를 가지는 클래스를 지원 하도록 멤버 함수 작성
제8장 포인터와 동적객체 생성 포인터의 개념을 이해한다. 포인터와 관련된 연산을 이해한다.
5. 논리적 자료표현 : 구조체.
12. 상속 : 고급.
^^ Computer Programming 2 dmpr.cnu.ac.kr/~daygax.
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
제 6 장 함수(functions).
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
Chapter 13. 템플릿(Template) 1
Chapter 15. 예외처리(Exception Handling)
Chapter 2 C++ 함수와 네임스페이스. 최호성.
중복 멤버의 처리 조 병 규 한 국 교 통 대 학 교 SQ Lab..
제 8장. 클래스의 활용 학기 프로그래밍언어및실습 (C++).
3. 모듈 (5장. 모듈).
서브클래스 조 병 규 한 국 교 통 대 학 교 SQ Lab..
Static과 const 선언 조 병 규 한 국 교 통 대 학 교 SQ Lab..
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
17장. 문자열 01_ 문자열 사용의 기본 02_ 문자열의 사용.
29장. 템플릿과 STL 01_ 템플릿 02_ STL.
Java의 정석 제 8 장 예외처리 (Exception handling) Java 정석 남궁성 강의
Presentation transcript:

14. 예외처리

차례 예외 발생 예외 처리 예외 클래스 사용자 예외 클래스

예외 발생 예외 처리 프로그램 실행에서 예외가 발생한 경우에 대한 처리 과정 예외 처리가 없는 경우 정상적인 프로그램 실행이 안될 수도 있음

number2의 값을 0으로 입력한 경우 프로그램 실행이 정상적으로 되지 않음!!! 소스 14-1 (ch14_01.cpp) #include <iostream> using namespace std; int main() { int number1, number2; int quotient, reminder; cout << "수1 : "; cin >> number1; cout << "수2 : "; cin >> number2; quotient=number1/number2; reminder=number1%number2; cout << "몫 : " << quotient << endl; cout << "나머지 : " << reminder << endl; return 0; } number2의 값을 0으로 입력한 경우 프로그램 실행이 정상적으로 되지 않음!!!

소스 14-2 (ch14_02.cpp)  number2의 값이 0일 경우에 대한 처리 코드 포함 #include <iostream> using namespace std; int main() { int number1, number2; int quotient, reminder; cout << "수1 : "; cin >> number1; cout << "수2 : "; cin >> number2; if (number2==0) cout << number1 << "은 0으로 나눌 수 없습니다!!" << endl; return 1; } quotient=number1/number2; reminder=number1%number2; cout << "몫 : " << quotient << endl; cout << "나머지 : " << reminder << endl; return 0;

예외처리 try와 catch 1 C++은 예외처리 블록을 제공 try { 예외 발생 여부를 확인해서 발생할 경우 throw 전달인수; 예외가 발생하지 않은 경우 수행할 내용 } catch (throw에서 전달받은 인수) 예외가 발생했을 때 수행할 내용

예외처리 try와 catch 2 try 블록 catch 정상적인 처리 과정 예외 발생시 throw 명령 실행  catch 블록으로 제어 이동함 catch 예외 처리 과정 throw 명령으로 전달된 매개변수 처리

소스 14-3 (ch14_03.cpp) : try~catch 사용 예 cout << "수1 : "; cin >> number1; cout << "수2 : "; cin >> number2; try { if (number2==0) throw number1; quotient=number1/number2; reminder=number1%number2; cout << "몫 : " << quotient << endl; cout << "나머지 : " << reminder << endl; } catch (int e_num) cout << e_num << "은 0으로 나눌 수 없습니다!!" << endl;

소스 14-4 (ch14_04.cpp) : 함수에서 예외 블록 호출하기 1 #include <iostream> using namespace std; double Average(const int total, const int num) { if (total<0 || num==0) throw num; return total/(double)num; } int Sum(const int score1, const int score2, const int score3) if (score1<0 || score2<0 || score3<0) throw 3; return score1+score2+score3; 두 함수 모두 try 블록에서 호출됨

소스 14-4 (ch14_04.cpp) : 함수에서 예외 블록 호출하기 2 int main() { int kor=-100, eng=99, math=98; int total=0; double aver; try total=Sum(kor, eng, math); cout << "합 : " << total << endl; } catch (int i) cout << "*************************************" << endl; cout << i << "개의 과목점수는 0보다 커야 합니다!!!" << endl; Sum() 함수의 throw에 의해 제어가 첫번째 catch 블록으로 이동될 수 있음

소스 14-4 (ch14_04.cpp) : 함수에서 예외 블록 호출하기 3 try { aver=Average(total, 0); cout << "평균 : " << aver << "**" << aver << endl; } catch(int n) cout << "#####################################" << endl; cout << "과목 수는 " << n << "보다 커야 합니다!!!" << endl; return 0; Average() 함수의 throw에 의해 제어가 두번째 catch 블록으로 이동될 수 있음

예외 처리 정보를 함수 선언에 넣기 함수 선언에서 throw 덧붙이기!! int Total(const int k, const int e, const int m); 함수에 예외처리를 덧붙이면 int Total(const int k, const int e, const int m) throw (char *); 예외처리 정보를 함수 선언에 넣는 것에 대해 Visual C++ 컴파일러에서 정확하게 지원하고 있지 않음 이를 해결하기 위해 #pragma warning (disable : 4290) 을 프로그램 코드에 삽입하기 바람

소스 14-5 (ch14_05.cpp) : 함수 선언에서 예외처리 코드 포함하기 1 #include <iostream> #pragma warning( disable : 4290 ) using namespace std; int Total(const int k, const int e, const int m) throw(char *); double Average(const int s, const int num) throw(char *); int main() { int kor=-100, eng=99, math=98; int total=0; double aver; try total=Total(kor, eng, math); aver=Average(total,0); cout << "합 : " << total << endl; cout << "평균 : " << aver << endl; }

소스 14-5 (ch14_05.cpp) : 함수 선언에서 예외처리 코드 포함하기 2 catch (char *msg) { cout << "*************************************" << endl; cout << msg << endl; } return 0; int Total(const int k, const int e, const int m) throw(char *) if (k<0 || e<0 || m<0) throw "과목 점수는 0보다 커야 합니다"; return k+e+m; double Average(const int s, const int num) throw(char *) if (s<0 || num<=0) throw "잘못된 매개변수입니다."; return s/(double)num;

표준 예외 클래스 exception 클래스, exception 클래스를 상속한 여러 파생 클래스들~ exception.h 자주 발생하는 예외처리를 포함함 bad_alloc – new 연산에 의해 발생한 예외처리 bad_cast – dynamic_cast 연산에 의해 발생한 예외처리 등

소스 14-6 (ch14_06.cpp) #include <iostream> #include <exception> using namespace std; int main() { try for (int i=1; i<=100; i++) new int[70000000]; cout << i << "번째 배열이 생성되었습니다." << endl; } catch (bad_alloc &e) cout << "Exception : " << e.what() << endl; return 0; 실행 결과 1번째 배열이 생성되었습니다. 2번째 배열이 생성되었습니다. 3번째 배열이 생성되었습니다. 4번째 배열이 생성되었습니다. 5번째 배열이 생성되었습니다. 6번째 배열이 생성되었습니다. Exception : bad allocation

예외 클래스 예외 클래스 예외 객체 생성시점 관련 내용 runtime_error 실행 오류, <stdexcept> 파생 클래스 : overflow_error, underflow_error bad_alloc 메모리 할당 오류 new bad_cast 형변환 오류 dynamic_cast bad_type_id typeid에 대한 피 연산자가 널 포인터인 경우 typeid bad_exception 예기치 못한 처리 함수 발생 목록에 있지 않은 예외 bad_logic_error 클래스 논리 오류, <stdexcept> 파생 클래스 : invalid_argument, length_error, out_of_range

사용자 예외 클래스 표준 예외 클래스를 상속 받아 사용자 예외 클래스 정의 업무 처리 클래스 - 멤버 함수 내에서 예외가 발생할 경우 throw로 예외 객체 생성하여 catch 블록으로 제어 이동 업무 처리 예외 클래스 멤버 변수나 멤버 함수를 통해 예외 처리 내용을 포함함

실습 세 과목의 성적 처리 클래스와 성적 처리로 인한 예외 사항을 사용자 예외 클래스로 정의해 보자. class Sung { public: Sung(); Sung(const int kor, const int eng, const int math); int GetTotal(); double GetAver(); private : int kor, eng, math,total; double aver; }; class SungException : public logic_error { public : SungException(const int total, const int num); int GetTotal(); int GetNum(); private : int total, num; };

소스 14-7, 14-8 (ch14_sung.h, ch14_sung.cpp) int Sung::GetTotal() { if (kor<=0 || eng<=0 || math<=0) throw SungException(total, 3); //예외 객체 생성하여 전달 total=kor+eng+math; return total; } double Sung::GetAver() if (total<0) aver=total/(double)3; return aver; SungException::SungException(const int total, const int num) : logic_error("잘못된 인수값") //기반 클래스 생성자 호출 { this->total=total; this->num=num; }

소스 14-9 (ch14_07.cpp) #include "ch14_sung.h" int main() { try Sung p1(10, 30, -10); cout << "총점 : " << p1.GetTotal() << endl; cout << "평균 : " << p1.GetAver() << endl; } catch (SungException &e) cout << e.what() << endl; cout << "전달된 총점 : " << e.GetTotal() << endl; cout << "전달된 과목 수 : " << e.GetNum() << endl; return 0;