제 12장 예외 처리 12.1 설계 쟁점 12.2 PL/I의 ON-조건 12.3 Ada의 예외 처리

Slides:



Advertisements
Similar presentations
Copyright © 2015 Pearson Education, Inc. 6 장 : 프로그래밍 언어.
Advertisements

멘토링 2 주차 장 프로그래밍을 위한 자바의 자료형  값이 변하지 않는 상수  메모리 기억공간인 변수.
Copyright © 2006 The McGraw-Hill Companies, Inc. 프로그래밍 언어론 2nd edition Tucker and Noonan 5 장 타입 “ 타입은 컴퓨터 프로그래밍의 효소이다 ; 프로그래밍은 타입을 통해 소화할만한 것이 된다.” 로빈.
명품 JAVA Programming 제 3 장 반복문, 배열, 예외처리.
11장. 프로토콜 핸들러 AI &HC I LAB 김 성 현.
10. 예외 처리.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
C++ Espresso 제3장 배열과 포인터.
C++ Espresso 제3장 배열과 포인터.
PL/SQL.
C++ Espresso 제1장 기초 사항.
IntArray[0] int length 5 intArray 객체 제 3 장 반복문, 배열, 예외처리.
Programming for the java Virtual machine
알기 쉽게 해설한 Java 8th edition
제 4장 문 장 배정문 혼합문 제어문 표준 입출력.
Chapter 10 – 추상 자료형 Outline 10.1 소개 10.2 Ada의 추상 자료형 10.3 C++의 추상 자료형
제6장 제어(Control) 6.1 구조적 프로그래밍(Structured Programming)
C++ 프로그래밍 년 2학기 전자정보공학대학 컴퓨터공학부.
Chapter 11 – 예외 처리 Outline 11.1 설계 쟁점 11.2 Pl/I의 예외 처리 11.3 Ada의 예외 처리
10장 예외 처리 프로그래밍 언어론 10.6 Pascal과 C의 에러 처리 10.1 설계 주제 10.2 PL/I의 예외 처리
명품 C++ 13장 예외 처리와 C 언어와의 링크 지정.
5 익셉션 처리.
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
8. 객체와 클래스 (기본).
제7장 제어구조 I – 식과 문장.
음악 재생 프로그램 예외 처리 방법 try/catch 블록 예외 선언 방법
[ 단원 08 ] 예외처리와 스레드.
8장 자바 입출력.
JAVA 프로그래밍 6장 객체지향프로그래밍의 핵심.
Chapter 12 – 예외 처리 Outline 12.1 설계 쟁점 12.2 Pl/I의 예외 처리 12.3 Ada의 예외 처리
Power Java 제15장 예외 처리 (Exception Handling).
01. 직렬화와 역직렬화에 대하여 객체의 직렬화 직렬화와 역직렬화
10장 예외 (Exceptions).
Lesson 9. 예외처리.
명품 Java Programming.
Chap07 예외 처리 7.1 예외의 개요 7.2 예외 관련 클래스 7.3 예외 처리.
Hadoop 김연왕
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
DataScience Lab. 박사과정 김희찬 (월)
정적 멤버 변수/정적 멤버 함수 - friend 함수/클래스 template
Android Coding Convention
주소록 프로그램.
스택(Stack) 김진수
Network Programming(1)
자바 5.0 프로그래밍.
제 4주 2014년 1학기 강원대학교 컴퓨터학부 담당교수: 정충교
-제어문, 함수, 클래스- IS lab. 김건영 Python -제어문, 함수, 클래스- IS lab. 김건영
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
Java Virtual Machine Chapter 5. 제어문 Ps lab 김윤경.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
가상함수와 추상 클래스.
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
[CPA340] Algorithms and Practice Youn-Hee Han
컴퓨터공학실습(I) 3주 인공지능연구실.
Java IT응용시스템공학과 김형진 교수 5장. 객체지향 개념 public class SumTest {
제 5장 변수, 바인딩, 식 및 제어문 5.1 변수 5.6 표현식 5.2 바인딩 5.7 조건문 5.3 선언 5.8 반복문
자바 5.0 프로그래밍.
루프와 카운트 Looping and counting
Chapter 02. 소프트웨어와 자료구조.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
Signature, Strong Typing
Signature, Strong Typing
제 11장. 템플릿과 STL 학기 프로그래밍언어및실습 (C++).
JVM의 구조와 메모리 모델 JVM의 내부 구조 클래스 파일 클래스 로더 메소드(method) 영역 힙(heap) 영역
03. 메모리 관리 C++ 프로그램에서 다룰 수 있는 메모리의 종류
Signature, Strong Typing
C# 10장. 참조형.
Java 5장. 객체지향 개념 public class SumTest {
C.
제 1장 프로그래밍 언어 소개 1.1 프로그래밍 언어란 무엇인가 1.2 프로그래밍 언어를 배워야 하는 이유
Presentation transcript:

제 12장 예외 처리 12.1 설계 쟁점 12.2 PL/I의 ON-조건 12.3 Ada의 예외 처리 12.4 C++의 예외 처리 12.5 Java의 예외 처리

12.1 설계 쟁점 프로시저의 종료 방법 의도적 종료 (goto 문, return 문) 예외 처리 12.1 설계 쟁점 프로시저의 종료 방법 의도적 종료 (goto 문, return 문) 시스템 인터럽트 (overflow, underflow) 특수 조건 (EOF 등 예외 조건) 예외 처리 도입 프로그래머가 예외 조건 제어 가능한 언어 PL/I : 최초의 제공 언어 CLU, Ada 발전

전통적 제어 흐름이 아닌 정보 교환의 특별 제어 의미 초기에는 하드웨어 인터럽트 루틴 사용 예외 처리 예외 처리 예외란 오류가 아님 전통적 제어 흐름이 아닌 정보 교환의 특별 제어 의미 초기에는 하드웨어 인터럽트 루틴 사용 Invoke, activate, signal, raise A가 B 호출 (invoke) B가 활성화 (activate) 정상적 끝마침이나 예외 선호 (signal) 예외 신호가 예외 발생 (raise)

어떤 procedure가 예외 처리 할 것인가? - 상기 예 - 호출자만이 예외 처리를 함(가정) - 실행 재개 허용(주종관계와 다른 개념) 하거나 종료

12.2 PL/I의 ON 조건 1. CONVERSION 12. CONDITION 2. FIXEDOVERFLOW 예외 처리 12.2 PL/I의 ON 조건 1. CONVERSION 2. FIXEDOVERFLOW 3. OVERFLOW 4. UNDERFLOW 5. ZERODIVIDE 6. SIZE 7. SUBSCRIPTRAGE 8. STRINGRANGE 9. CHECK 10.AREAR 11. ATTENSION 12. CONDITION 13. ENDFILE 14. ENDPAGE 15. ERROR 16. FINISH 17. KEY 18. NAME 19. PENDING 20. RECORD 21. TRANSMIT 22. UNDEFINITEFILE

ON문을 지닌 PL/I program 예 예외 처리 1 TEST:PROCEDURE OPTIONS(MAIN); 2 DECLARE (PERSON , GRADE) FIXED; 3 DECLARE LAST FIXED INIT(0); 4 DECLARE SUMMARY(1:50 , 0:100) FIXED; 5 ON ENDPAGE(SYSPRINT) /* 오류 메시지리스트를 위한 제목인쇄 */ 6 BEGIN PUTPAGE; PUT LIST(' ' , 'LIST ERROR DATA'); END; 7 ON SUBSCRIPTRANGE BEGIN 8 IF LAST = 0 THEN SIGNAL ENDPAGE(SYSPRINT); 9 /* 오류가 첫번째로 발견되면 오류 리스트의 제목 인쇄 */ 10 IF I NOT = LAST THEN /* 새로운 경우를 검사 */ 11 PUT SKIP DATA(I , PERSON , GRADE); 12 LAST = I 13 END; 14 ON ENDFILE(SYSIN) BEGIN; 15 PUT PAGE LIST(' ' , ' ' , `OUTPUT FOR CLASS'); 16 PUT SKIP LIST(' ' , ' ' , 'SUMMARY'); 17 PUT SKIP(3) LIST(SUMMARY); 18 IF LAST NOT = 0 THEN PUT SKIP(4) LIST 19 ('SOME DATA IS INCOMPLETE, SEE OUTPUT'); 20 END; 21 SUMMARY = 0; 22 A:DO I = 1 BY 1; 23 GET LIST(PERSON , GRADE); 24 SUMMARY(PERSON , GRADE) = SUMMARY(PERSON , GRADE) + GRADE; 25 END A; 26 END TEST;

12.3 Ada의 예외 처리 중요 설계 쟁점 예외 처리 구축 주력 Ada의 미리 정의된 예외들 CONSTRAINT-ERROR:영역, 첨자, 또는 열거형 자료 등에 대한 제한을 벗어날 때 발생되고, 또한 null로 접근할 때 발생됨. NUMERIC-ERROR :연산 결과가 영역을 벗어날 때 발생됨. SELECT-ERROR :else 부분이 없는 택일 조건들 모두가 만족되지 않을 때 발생됨. STORAGE-ERROR :기억 장소를 할당할 수 없을 때 발생됨. TASKING-ERROR :태스크간에 통신 할 때 발생됨.

Ada의 예외 처리기 (Exception Handler) 예외 사항 발생시 프로그램이 멈추지 않고 적합한 일들을 수행하도록 처리하는 루틴 begin ..... exception when NUMERIC_ERROR | CONSTRAINT_ERROR => PUT(“Numeric or Constraint error occurred”) ; ...... when STORAGE_ERROR => PUT(“Ran out of space”) ; when others => PUT(“Something else went wrong”) ; end ; 예외 사항 처리후 제어는 그 상위 프로그램 단위로 넘어감

사용자가 예외 사항을 프로그램 선언부에 정의 할 수 있음 예외 처리 사용자 저의 예외 사항 사용자가 예외 사항을 프로그램 선언부에 정의 할 수 있음 procedure NAVIGATE is DEVIATION : FLOAT ; OFF_COURCE : exception ; begin loop READ_COURCE(DEVIATION) ; if abs SEVIATION > 0.1 then raise OFF_COURCE ; end if ; CORRECT_COURCE(DEVIATION) ; end loop ; exception when OFF_COURCE => SHUT_OFF_SENSOR ; SEND_MSG_TO(“EMERGENCY”) ; GO_TO_MANUAL_CONTROL ; end NAVIGATE ;

예외 사항이 발생되었지만 해당 예외 처리기가 없는 경우는 호출한 상위 프로그램 단위로 제어가 넘어감 예외 사항의 전파 예외 사항이 발생되었지만 해당 예외 처리기가 없는 경우는 호출한 상위 프로그램 단위로 제어가 넘어감 예외의 전파(Propagation of Exception) 예외사항 발생

동적인 방법에 의해 상위 프로그램 단위로 전파됨 예외 처리 예외 사항의 전파 법칙 (1) 예외 사항은 해당 처리기가 존재치 않을 때 동적인 방법에 의해 상위 프로그램 단위로 전파됨 OUTER : declare OOPS : exception ; begin OOPs : exception ; raise OFF_COURCE ; end ; ...... exception when OOPS => PUT(“We caught the OOPS”) ; end OUTER ;

예외 사항의 전파 법칙 (2) ※ F(4)로 호출시 Got it 이 5회 출력됨 procedure F(N:INTEGER) 예외 처리 예외 사항의 전파 법칙 (2) procedure F(N:INTEGER) X : exception ; begin if N=0 then raise X ; else F(N-1) end if ; exception when X => PUT(“Got it”) ; raise ; when others => null ; end F; ※ F(4)로 호출시 Got it 이 5회 출력됨

Ada 예외 처리 루틴 구문 예 begin -- this is a sequence of statements exception when NUMERIC_ERROR => -- 수치 오류를 처리하는 작업 when BAD_FORMAT => -- 어떤 예외 처리 작업 when others => -- 위 두 예외를 제외한 모든 예외를 처리하는 작업 end; <exception-handler> ::= when <exception-choice> {|<exception-choice>} => <seqence-of-statements> <exception-choice> ::= <exception-name> | others

Ada 예외 처리 예 1 procedure P is 2 BAD-FORMAT:exception; 3 procedure Q is 4 begin 5 . . . 6 if S /='' then raise BAD_FORMAT;end if; 7 . . . 8 end Q; 9 procedure R is 10 begin 11 Q; 12 exception when BAD_FORMAT => -- handler body 1 13 end R; 14 begin 15 R; 16 Q; 17 exception when BAD_FORMAT => -- handler body 2 18 end P;

Ada 예외 전파 사용 예 procedure A is procedure B is FLOPPED :exception; begin 예외 처리 Ada 예외 전파 사용 예 procedure A is procedure B is FLOPPED :exception; begin -- sequence of statements exception when FLOPPED => raise end; B; when others => -- handle FLOPPED if possible else raise;

Ada에서 다양한 예외들의 사용 예 예외 처리 procedure DOSOMETHING is HANDLE_ERROR:exception; begin -- perform some set of actions exception when HANDLE_ERROR => -- error handing code end; end DOSOMETHING; function SECURE_DIVIDE(X , Y:REAL) return REAL is return X / Y; when NUMERIC_ERROR => return 0; end SECURE_DIVIDE; procedure COPYOVER is OPEN(INFILE); OPEN(OUTFILE); loop GET(INFILE , CHARACTER); PUT(OUTFILE , CHARACTER); end loop; when END_OF_FILE => PUT(OUTFILE , EOF); CLOSE(OUTFILE); CLOSE(INFILE); end COPYOVER;

12.4 C++의 예외 처리 C++의 예외 처리 1990년 ANSI C++ 표준 위원회 try 구성 복합문과 예외 처리 할 수 있는 catch 복합문으로 구성 try { -- 예외가 발생하기를 기대하는 코드 } catch (formal parameter) { -- 예외 처리기 몸체부 . . .

C++의 예외 처리 OUTER : declare OOPS : exception ; begin OOPs : exception ; raise OFF_COURCE ; end ; ...... exception when OOPS => PUT(“We caught the OOPS”) ; end OUTER ;

C++의 예외 처리기 사용 예 예외 처리 #include <iostream> using namespace std; void main() { int new_grade = 0 , index, limit_1, limit_2; int freq[10]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; short int eof_condition = 0; try { while (1) { if (!(cin >> new_grade)) throw eof_condition; index = new_grade / 10; { try { if (index < 0 || index > 9) throw (new_grade); freq[index]++; } catch (int grade) { if (grade == 100) freq[9]++; else cout << "Error -- new grade : " << grade << " is out of range " << endl;

예외 처리 catch (short int) { cout << "Limits Frequency" << endl; for (index = 0; index < 10 ; index++) { limit_1 = 10 * index; limit_2 = limit_1 + 9; if (index == 9) limit_2 = 100; cout << limit_1 <<" - "<< limit_2 << " = "<< freq[index] << endl; }

12.5 Java의 예외 처리 예외의 종류 시스템 정의 예외(System-defined exception or predefined exception) 프로그램의 부당한 실행에 의한 예외 비검사 예외(unchecked exception) Error와 RuntimeException 클래스 ArithmeticException, IOException, IndexOutOfBoundsException, ArrayStoreException, NegativeArraySizeException, NullPointerException, SecurityException, IllegalMonotorException등… 프로그래머 정의 예외(Programmer-defined exception) 프로그래머에 의도적으로 야기되는 예외 검사 예외(checked exception) : 예외 처리기의 존재 검사

Java 의 예외 계층 구조 Object Throwable Error Exception LinkaqeError RuntimeException Error Exception CheckedException ArithemticException LinkaqeError ThreadDeath VirtualMachineError Object Throwable

Java 예외 처리기 C++ 예외 처리기와 동일한 형태 catch문은 매개변수를 갖는 클래스는 미리 정의한 클래스 Throwable의 후손이어야 함 class MyException extends Exception { public MyException( ) { } public MyException(String message) { super(message); } 예외 정의 MyException myExceptionObject = new MyExeption( ); … throw myExceptionObject; 또는 throw new MyException(“Here is HongKilDong”); 예외 발생

예외 처리 바운딩 try구문에서 발생한 경우 catch 함수의 매개변수 발생된 예외 객체나 발생된 예외 객체의 조상 정적 바인딩 내포한 상위 try 구문의 처리기 탐색 동적 바인딩 메소드의 호출자에게 전파 Java 의 throw 절 c++ 의 throw 절과 유사하지만 의미는 전혀 다르다. Java throw 절에 있는 예외처리의 의미 그 예외 클래스 또는 후손 예외 클래스가 그 메소드에 의해 서 발생될 수 있다는 것을 지정

비검사 예외 검사 예외 컴파일러가 전혀 관계하지 않는 예외 클래스 Error와 RuntimeException, 그 후손 클래스들의 예외 검사 예외 메소드에서 발생시킬 수 있는 모든 검사 예외를 throws절에 나열했는지 또는 메소드에 나열했는지를 컴파일러가 확인하는 예외

JAVA의 예외 처리기 사용 예 import java.io.*; class NegativeInputException extends Exception{ public NegativeInputException(){ System.out.println("End of input data reached"); } class GradeDist{ int newGrade, index, limit_1, limit_2; int [] freq = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; void buildDist() throws IOException{ DataInputStream in = new DataInputStream(System.in); try{ while(true){ System.out.println("Please input a grade"); newGrade = Integer.parseInt(in.readLine()); i f(newGrade<0) throw new NegativeInputException(); index = newGrade / 10; freq[index]++; }catch(ArrayIndexOutOfBoundsException a){ if(newGrade == 100) freq[9]++; else System.out.println("Error - new grade: " + newGrade + " is out of range"); }

catch(NegativeInputException n){ System.out.println("\nLimits Frequency\n"); for(index=0;index<10;index++){ limit_1 = 10 * index; limit_2 = limit_1 + 9; if(index == 9) limit_2 = 100; System.out.println(" " + limit_1 + " - " + limit_2 + " " + freq[index]); } public static void main(String[] args) throws Exception{ GradeDist gd = new GradeDist(); gd.buildDist();

finally 절 프로세스가 반드시 실행되어야 할 상황이 존재하는 경우 폐쇄(close)되어야 할 파일 메소드에 제공된 외부 자원을 해제해야 하는 경우 try { … } catch(…) { …//** More handlers finally { ……

C++와 Java의 예외 처리 비교 Exception C++ JAVA 예외 처리 ․ 예외 상황의 발생이 프로그래머가 기술해주는 것만 가능 컴퓨터에서 발생하는 각종 오류, 외부 시스템에서 발생하는 오류들에 대해서는 C++이 기본적인 예외 처리를 하지 않는다. 이러한 오류상황에 대해서 프로그래머가 직접 체크하여 기술하여야 한다. ․ 예외를 처리하는 데이터 형이 다양 ․ 시스템 정의 예외를 처리할 수 있는 방법 제공 - ADA와 같은 예외 개념을 도입한 언어들과 마찬가지로 언어상에서 기본적으로 처리하는 예외를 갖는다. ․ 예외를 처리하는 데이터 형이 하나의 형태로 정의 이 예외처리를 위하여 만들어진 클래스가 Throwable 클래스이다. 이 클래스로부터 파생된 클래스만이 예외처리가 가능하다. ․ finally 라는 구문의 추가 - 예외의 발생 유무를 떠나 해당 예외 처리 블록이 종료되는 상황에서 반드시 수행해 주어야만 하는 일을 기술하는 도구로 사용.

C++의 예외처리보다 개선된 점 발생될 수 있는 객체와 프로그램에 있는 모든 다른 객체를 구분 머리부로부터 발생할 수 있지만 처리하지 않은 예외를 알 수 있다 finally절의 추가로 복합문이 종료되는 것에 상관없이 청소작업이 발생하는 것을 허용한다 사용자 예외 처리기에서 처리될 수 있는 여러가지 시스템 예외를 묵시적으로 발생시킨다