Presentation is loading. Please wait.

Presentation is loading. Please wait.

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

Similar presentations


Presentation on theme: "제 12장 예외 처리 12.1 설계 쟁점 12.2 PL/I의 ON-조건 12.3 Ada의 예외 처리"— Presentation transcript:

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

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

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

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

5 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

6 ON문을 지닌 PL/I program 예 예외 처리 1 TEST:PROCEDURE OPTIONS(MAIN);
DECLARE (PERSON , GRADE) FIXED; DECLARE LAST FIXED INIT(0); DECLARE SUMMARY(1:50 , 0:100) FIXED; ON ENDPAGE(SYSPRINT) /* 오류 메시지리스트를 위한 제목인쇄 */ BEGIN PUTPAGE; PUT LIST(' ' , 'LIST ERROR DATA'); END; ON SUBSCRIPTRANGE BEGIN IF LAST = 0 THEN SIGNAL ENDPAGE(SYSPRINT); /* 오류가 첫번째로 발견되면 오류 리스트의 제목 인쇄 */ 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 ('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; END TEST;

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

8 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 ; 예외 사항 처리후 제어는 그 상위 프로그램 단위로 넘어감

9 사용자가 예외 사항을 프로그램 선언부에 정의 할 수 있음
예외 처리 사용자 저의 예외 사항 사용자가 예외 사항을 프로그램 선언부에 정의 할 수 있음 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 ;

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

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

12 예외 사항의 전파 법칙 (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회 출력됨

13 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

14 Ada 예외 처리 예 1 procedure P is 2 BAD-FORMAT:exception; 3 procedure Q is
begin if S /='' then raise BAD_FORMAT;end if; end Q; procedure R is begin Q; exception when BAD_FORMAT => -- handler body 1 end R; 14 begin R; Q; exception when BAD_FORMAT => -- handler body 2 18 end P;

15 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;

16 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;

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

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

19 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;

20 예외 처리 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; }

21 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) : 예외 처리기의 존재 검사

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

23 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”); 예외 발생

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

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

26 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"); }

27 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();

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

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

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


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

Similar presentations


Ads by Google