제 12 장 예외 처리

30
제 12 제 제제 제제 12.1 설설 설설 12.2 PL/I 설 ON- 설설 12.3 Ada 설 설설 설설 12.4 C++ 설 설설 설설 12.5 Java 설 설설 설설

description

제 12 장 예외 처리. 12.1 설계 쟁점. 12.2 PL/I 의 ON- 조건. 12.3 Ada 의 예외 처리. 12.4 C++ 의 예외 처리. 12.5 Java 의 예외 처리. 예외 처리. 12.1 설계 쟁점. 프로시저의 종료 방법. 의도적 종료 (goto 문 , return 문 ). 시스템 인터럽트 (overflow, underflow). 특수 조건 (EOF 등 예외 조건 ). 예외 처리 도입. 프로그래머가 예외 조건 제어 가능한 언어. PL/I : 최초의 제공 언어. - PowerPoint PPT Presentation

Transcript of 제 12 장 예외 처리

Page 1: 제  12 장 예외 처리

제 12장 예외 처리

12.1 설계 쟁점

12.2 PL/I 의 ON- 조건

12.3 Ada 의 예외 처리

12.4 C++ 의 예외 처리

12.5 Java 의 예외 처리

Page 2: 제  12 장 예외 처리

프로시저의 종료 방법

12.1 설계 쟁점

의도적 종료 (goto 문 , return 문 )

예외 처리

시스템 인터럽트 (overflow, underflow)특수 조건 (EOF 등 예외 조건 )

예외 처리 도입프로그래머가 예외 조건 제어 가능한 언어PL/I : 최초의 제공 언어CLU, Ada 발전

Page 3: 제  12 장 예외 처리

예외 처리예외란 오류가 아님전통적 제어 흐름이 아닌 정보 교환의 특별 제어 의미초기에는 하드웨어 인터럽트 루틴 사용

Invoke, activate, signal, raise

A 가 B 호출 (invoke)B 가 활성화 (activate)정상적 끝마침이나 예외 선호 (signal)예외 신호가 예외 발생 (raise)

예외 처리

Page 4: 제  12 장 예외 처리

어떤 procedure 가 예외 처리 할 것인가 ?

P

Q

R

signal P

signal Q

invokes

invokes

resume Q

resume R

P

Q

R

signal

P

signal

Q

invoke

Q

invoke

R

resume

Q

resume

R

resume

R

(a) (b)

signal

P PQRsignal Psignal Qinvokesinvokesresume Qresume R(a)PQRsignalPsignalQinvokeQinvokeRresumeQresumeRresumeR(b)signalP

- Procedure 가 예외 신호를 보낼 수 있는 선택 방법

- 상기 예 - 호출자만이 예외 처리를 함 ( 가정 )

- 실행 재개 허용 ( 주종관계와 다른 개념 ) 하거나 종료

예외 처리

Page 5: 제  12 장 예외 처리

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. ENDFILE14. ENDPAGE 15. ERROR 16. FINISH17. KEY 18. NAME 19. PENDING20. RECORD 21. TRANSMIT 22. UNDEFINITEFILE

예외 처리

Page 6: 제  12 장 예외 처리

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 BEGIN8 IF LAST = 0 THEN SIGNAL ENDPAGE(SYSPRINT) ;9 /* 오류가 첫번째로 발견되면 오류 리스트의 제목 인쇄 */10 IF I NOT = LAST THEN /* 새로운 경우를 검사 */11 PUT SKIP DATA(I , PERSON , GRADE) ;12 LAST = I13 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) LIST19 ('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 ;

예외 처리

Page 7: 제  12 장 예외 처리

중요 설계 쟁점

12.3 Ada 의 예외 처리

예외 처리 구축 주력

예외 처리

Ada 의 미리 정의된 예외들

CONSTRAINT-ERROR :영역 , 첨자 , 또는 열거형 자료 등에 대한 제한을 벗어날 때 발생되고 , 또한 null 로 접근할 때

발생됨 .NUMERIC-ERROR :연산 결과가 영역을 벗어날 때 발생됨 .SELECT-ERROR : else 부 분 이 없 는 택 일 조 건 들 모 두 가 만족되지

않을 때 발생됨 .STORAGE-ERROR :기억 장소를 할당할 수 없을 때 발생됨 .TASKING-ERROR :태스크간에 통신 할 때 발생됨 .

Page 8: 제  12 장 예외 처리

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 ;

예외 사항 처리후 제어는 그 상위 프로그램 단위로넘어감

예외 처리

Page 9: 제  12 장 예외 처리

사용자 저의 예외 사항사용자가 예외 사항을 프로그램 선언부에 정의 할 수 있음

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 ;

예외 처리

Page 10: 제  12 장 예외 처리

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

예외사항 발생예외사항 발생

예외의 전파 (Propagation of Exception)

예외 처리

Page 11: 제  12 장 예외 처리

예외 사항의 전파 법칙 (1)

예외 사항은 해당 처리기가 존재치 않을 때동적인 방법에 의해 상위 프로그램 단위로 전파됨

OUTER : declare OOPS : exception ; begin declare OOPs : exception ; begin raise OFF_COURCE ; end ; ...... exception when OOPS => PUT(“We caught the OOPS”) ; end OUTER ;

OUTER : declare OOPS : exception ; begin declare OOPs : exception ; begin raise OFF_COURCE ; end ; ...... exception when OOPS => PUT(“We caught the OOPS”) ; end OUTER ;

예외 처리

Page 12: 제  12 장 예외 처리

예외 사항의 전파 법칙 (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;

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 회 출력됨

예외 처리

Page 13: 제  12 장 예외 처리

Ada 예외 처리 루틴 구문 예

begin -- this is a sequence of statementsexception when NUMERIC_ERROR => -- 수치 오류를 처리하는 작업 when BAD_FORMAT => -- 어떤 예외 처리 작업 when others => -- 위 두 예외를 제외한 모든 예외를 처리하는 작업end ;

<exception-handler> ::= when <exception-choice> {|<exception-choice>} => <seqence-of-statements><exception-choice> ::= <exception-name> | others

예외 처리

Page 14: 제  12 장 예외 처리

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 begin11 Q ;12 exception when BAD_FORMAT => -- handler body 113 end R ;14 begin15 R ;16 Q ;17 exception when BAD_FORMAT => -- handler body 218 end P ;

예외 처리

Page 15: 제  12 장 예외 처리

Ada 예외 전파 사용 예

procedure A is procedure B is FLOPPED : exception ; begin -- sequence of statements exception when FLOPPED => raise end ;begin B ; exception when others => -- handle FLOPPED if possible else raise ;end ;

예외 처리

Page 16: 제  12 장 예외 처리

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 begin return X / Y ; exception when NUMERIC_ERROR => return 0 ; end SECURE_DIVIDE ;procedure COPYOVER is begin OPEN(INFILE) ; OPEN(OUTFILE) ; loop GET(INFILE , CHARACTER) ; PUT(OUTFILE , CHARACTER) ; end loop ; exception when END_OF_FILE => PUT(OUTFILE , EOF) ; CLOSE(OUTFILE) ; CLOSE(INFILE) ;end COPYOVER ;

예외 처리

Page 17: 제  12 장 예외 처리

C++ 의 예외 처리

12.4 C++ 의 예외 처리

1990 년 ANSI C++ 표준 위원회

예외 처리

try 구성 복합문과 예외 처리 할 수 있는 catch 복합문으로 구성

try { -- 예외가 발생하기를 기대하는 코드 } catch (formal parameter) { -- 예외 처리기 몸체부 } . . . catch (formal parameter) { -- 예외 처리기 몸체부 }

Page 18: 제  12 장 예외 처리

C++ 의 예외 처리

OUTER : declare OOPS : exception ; begin declare OOPs : exception ; begin raise OFF_COURCE ; end ; ...... exception when OOPS => PUT(“We caught the OOPS”) ; end OUTER ;

예외 처리

Page 19: 제  12 장 예외 처리

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;

}}

}}

예외 처리

Page 20: 제  12 장 예외 처리

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

}}

예외 처리

Page 21: 제  12 장 예외 처리

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

Page 22: 제  12 장 예외 처리

RuntimeException

Error Exception

CheckedException

ArithemticException

LinkaqeErrorThreadDeath

VirtualMachineError

Object

Throwable

Java 의 예외 계층 구조

Page 23: 제  12 장 예외 처리

Java 예외 처리기C++ 예외 처리기와 동일한 형태catch 문은 매개변수를 갖는클래스는 미리 정의한 클래스 Throwable 의 후손이어야 함

class MyException extends Exception {public MyException( ) { }public MyException(String message) {

super(message);}

}

class MyException extends Exception {public MyException( ) { }public MyException(String message) {

super(message);}

}

MyException myExceptionObject = new MyExeption( );…throw myExceptionObject;또는throw new MyException(“Here is HongKilDong”);

MyException myExceptionObject = new MyExeption( );…throw myExceptionObject;또는throw new MyException(“Here is HongKilDong”);

예외 정의

예외 발생

Page 24: 제  12 장 예외 처리

예외 처리 바운딩 try 구문에서 발생한 경우 catch 함수의 매개변수 발생된 예외 객체나 발생된 예외 객체의 조상 정적 바인딩 내포한 상위 try 구문의 처리기 탐색 동적 바인딩 메소드의 호출자에게 전파

Java 의 throw 절c++ 의 throw 절과 유사하지만 의미는 전혀 다르다 .Java throw 절에 있는 예외처리의 의미 그 예외 클래스 또는 후손 예외 클래스가 그 메소드에 의해 서 발생될 수 있다는 것을 지정

Page 25: 제  12 장 예외 처리

비검사 예외컴파일러가 전혀 관계하지 않는 예외

클래스 Error 와 RuntimeException, 그 후손 클래스들의 예외

검사 예외메소드에서 발생시킬 수 있는 모든 검사 예외를 throws 절에

나열했는지 또는 메소드에 나열했는지를 컴파일러가 확인하는 예외

Page 26: 제  12 장 예외 처리

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; try{

freq[index]++; }catch(ArrayIndexOutOfBoundsException a){

if(newGrade == 100) freq[9]++; else System.out.println("Error - new grade: " + newGrade + " is out of range");}

}}

JAVA 의 예외 처리기 사용 예

Page 27: 제  12 장 예외 처리

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

}}

Page 28: 제  12 장 예외 처리

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

try { …}catch(…) { …}…//** More handlersfinally { ……}

try { …}catch(…) { …}…//** More handlersfinally { ……}

Page 29: 제  12 장 예외 처리

예외 처리

Exception

C++ JAVA․ 예외 상황의 발생이 프로그래머가 기술해주는 것만 가능-컴퓨터에서 발생하는 각종 오류 , 외부 시스템에서 발생하는 오류들에 대해서는 C++ 이 기본적인 예외 처리를 하지 않는다 . 이러한 오류상황에 대해서 프로그래머가 직접 체크하여 기술하여야 한다 .

․ 예외를 처리하는 데이터 형이 다양

․ 시스템 정의 예외를 처리할 수 있는 방법 제공- ADA 와 같은 예외 개념을 도입한 언어들과 마찬가지로 언어상에서 기본적으로 처리하는 예외를 갖는다 .

․ 예외를 처리하는 데이터 형이 하나의 형태로 정의-이 예외처리를 위하여 만들어진 클래스가 Throwable 클래스이다 . 이 클래스로부터 파생된 클래스만이 예외처리가 가능하다 .

․ finally 라는 구문의 추가- 예외의 발생 유무를 떠나 해당 예외 처리 블록이 종료되는 상황에서 반드시 수행해 주어야만 하는 일을 기술하는 도구로 사용 .

C++ 와 Java 의 예외 처리 비교

Page 30: 제  12 장 예외 처리

C++ 의 예외처리보다 개선된 점발생될 수 있는 객체와 프로그램에 있는 모든 다른 객체를

구분

머리부로부터 발생할 수 있지만 처리하지 않은 예외를 알 수 있다

finally 절의 추가로 복합문이 종료되는 것에 상관없이 청소작업이 발생하는 것을 허용한다

사용자 예외 처리기에서 처리될 수 있는 여러가지 시스템 예외를 묵시적으로 발생시킨다