10 장 예외 처리

Post on 30-Dec-2015

55 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

DESCRIPTION

프로그래밍 언어론. 10 장 예외 처리. 10.1 설계 주제 10.2 PL/I 의 예외 처리 10.3 Ada 의 예외 처리 10.4 C++ 의 예외 처리 10.5 Java 의 예외 처리 10.6 Pascal 과 C 의 에러 처리. 예외 (exception) 정상적인 처리 상태로부터 벗어나는 이상 (anomaly) 소프트웨어에 의해 탐지되는 비정상적인 조건 뿐만 아니라 하드웨어에 의해 탐지되는 에러들을 포함 - PowerPoint PPT Presentation

TRANSCRIPT

10 장 예외 처리10.1 설계 주제10.2 PL/I 의 예외 처리10.3 Ada 의 예외 처리

10.4 C++ 의 예외 처리10.5 Java 의 예외 처리10.6 Pascal 과 C 의 에러 처리

프로그래밍 언어론

2

• 예외 (exception)– 정상적인 처리 상태로부터 벗어나는 이상 (anomaly)

– 소프트웨어에 의해 탐지되는 비정상적인 조건 뿐만 아니라 하드웨어에 의해 탐지되는 에러들을 포함

– 예외가 탐지될 때 예외가 제기 (raise) 되었다 혹은 신호 (signal) 가 왔다고 한다 .

– 예외 처리기 (exception handler) 는 예외가 탐지되었을 때 실행되도록 설계된 프로시져 또는 일련의 코드로써 예외 처리 후 다시 정상적으로 실행될 수 있도록 하는 것

– 예외 처리는 에러나 인터럽트의 유형에 따라 미리 정해진 곳으로 프로세서의 제어를 자동적으로 옮기는 하드웨어 인터럽트나 에러 트랩과 같은 기능을 프로그래밍 언어에서 구현하려는 시도

3

10.1 설계 주제 (1)

• Procedure 의 종료– goto, return ( 정상 )

– overflow, underflow, range error - system interrupt

– EOF 등의 예외 조건 ( 예상 가능한 조건 )

• 해결 방법– 예외 조건 제어 불가능 언어

• 오류시 약속된 값 반환 – 프로그래머가 매번 검사• 오류 처리 루틴으로 즉시 제어 이동

– 예외 조건 제어 가능 언어• PL/I : 최초 제공 언어• MESA, CLU, Ada, C++, Java : 세련된 방법 제공

4

10.1 설계 주제 (2)

• 예외 처리– 프로시져들 사이의 정보 교환

• 정상적인 호출 반환과는 다름

– 프로시져들간의 특별한 제어 허용

– 초기 예외 처리• 하드웨어 인터럽트 루틴을 사용

• 시스템에서 제공 : 종류 , 처리 루틴

– 예외 처리시 고려해야 할 쟁점• 어떤 프로시져가 발생된 예외를 처리 ?

• 예외 처리 후 예외 발생 프로시저의 활성화 지속 여부 ?

5

10.1 설계 주제 (3)• 어떤 프로시져가 발생된 예외를 처리 ?

– 활성화된 프로시져 중에서 결정하는 방법 ( 호출 순서 예 : P -> Q -> R)

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

(a) R 은 Q 에만 신호를 보냄 : Q 가 R 에서 발생된 예외를 처리하는 동안 , Q 에서 예외가 다시 발생하면 P 에 신호를 보낸다 . 이 때 P 는 이 예외를 처리한 후 Q 가 실행하던 작업을 계속할 수 있도록 제어를 넘겨주어 Q 가 실행 재개 (resume) 되고 , 결국 R 도 실행 재개(b) R 은 Q, P 중 하나를 택해 예외 신호를 보낼 수 있기 때문에 그림과 같은 예외 처리 경우 발생 가능

6

10.1 설계 주제 (4)

• 예외 처리의 주요 쟁점– 인터럽트 기능에 대한 액세스 방법이 제공되었는가 ?

– 사용자가 새로 정의하여 시스템 인터럽트에 우선할 수 있는가 ?

– 사용자 정의 예외가 가능한가 ? 이 예외를 어떻게 발생시키는가 ?

– 발생 가능한 예외의 영역 규칙은 무엇인가 ?

– 예외 처리기의 영역과 수명 규칙은 무엇인가 ?

– 예외를 발생시킨 프로시져를 실행 재개 혹은 종결시키는가 ?

– 발생된 예외의 전파 (propagation) 는 어떻게 되는가 ?

– 한 예외에 매개 변수를 사용하여 다양화 시킬 수 있는가 ?

– 예기치 않았던 모든 예외를 처리할 수 있는가 ?

– 예외 처리 루틴에서 예외를 발생 시킬 수 있는가 ? 이 때 후속 처리는 ?

– 내장된 예외를 위한 디폴트 동작이 존재하거나 , 처리기가 제공되어야 하는가 ?

– 내장 예외나 사용자 정의 예외를 무력하게 하는 것이 가능한가 ?

7

10.1 설계 주제 (5)

• 예외 처리기의 영역과 처리기의 결합procedure X(a,b,c) statement1 with ex_handler1 statement2 begin statement3 statement4 statement5 end with ex_handler2 statement6end X with ex_handler3

– 만일 예외가 statement3 이나 4, 또는 5 에서 제기되면 , 그것은 ex_handler2의 영역에 있게 된다 . statement1 에서 제기된 예외는 ex_handler1 에 의해 처리된다 . statement2 나 statement6 에서 제기된 예외는 ex_handler3 에 의해 처리된다 .

8

10.1 설계 주제 (6)

• 만일 프로시져 X 가 예외 처리기를 가지지 않고 예외가 제기된다고 가정하자 . 프로그램은 어디에서 예외 처리기를 찾는가 ?

두 가지 명백한 선택이 있다 .– X 의 영역으로 자신을 포함하는 모든 프로시져에서 예외 처리기를 찾을

때까지 가장 내부의 것을 먼저 살펴본다 . 아니면 예외 처리기가 존재하지 않고 프로그램의 실행이 중단된다고 결론을 맺는다 . 이것이 정적 영역 해결책이다 .

– 실행 시간 스택 위의 활동중인 프로시져를 살피고 예외 처리기를 그것들에서 탐색한다 . 이것은 동적 영역 해결책이다 .

9

10.2 PL/I 의 예외 처리 (1)• 시스템 제공 on condition( 조건 )

( 예 : ON ZERODIVIDE Q := -99;)

• 사용자가 직접 예외 발생( 예 : IF TEMP < 0.01 THEN SIGNAL ZERODIVIDE;)

• 수치계산 condition : default enable1. CONVERSION 2. FIXEDOVERFLOW 3. OVERFLOW

4. UNDERFLOW 5. ZERODIVIDE

• Program test condition : default disable6. SIZE 7. SUBSCRIPTRAGE 8. STRINGRANGE

9. CHECK 10.AREAR

• 입출력 condition : always enable11. ATTENSION 12. CONDITION 13. ENDFILE

14. ENDPAGE 15. ERROR 16. FINISH

17. KEY 18. NAME 19. PENDING

20. RECORD 21. TRANSMIT 22. UNDEFINITEFILE

10

10.2 PL/I 의 예외 처리 (2)

• 예외 조건 상태 제어 ( 가능 / 불능 )– enable 선언 : condition 이름 (prefix 사용 )

– disable 선언 : NO + condition 이름 (prefix 사용 )

– 예 ) (NOUNDERFLOW, STRINGRANGE)

disable enable

• 예외 조건 영역 (scope): 접두부에 조건의 이름들을 나열 – 문장 - 한 문장만이 예외 조건 영역– if 문 - condition field 만 영역 적용 – procedure, begin -end - 해당 블록 (inner 블록은 상속 )

11

10.2 PL/I 의 예외 처리 (3)

• 예외 처리 루틴 (Exception Handler)– 표준 시스템 예외 처리 루틴 : default – 별도 루틴 선언으로 무시 가능– 예외 처리 루틴 사용자 정의

ON condition-name <on-unit><on-unit> : 사용자 정의 예외 처리 루틴 ( 문장 또는 블록 )

• 예외 처리 수행 후 ( 제어 이동 )– 예외를 발생 시킨 문장– 예외를 발생 시킨 문장 다음 문장– handler 에서 별도로 분기 가능

• 예외 발생 (enable 상태 예외만 가능 )– 시스템에서 자동 발생– 사용자 발생

SIGNAL condition-nameSIGNAL condition-name (identifier) : 사용자 정의 예외 취급 가능

12

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 ;

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 ;

10

.2 P

L/I

예외

처리(4

)

13

10.2 PL/I 의 예외 처리 (5)

• 특징– 예외 처리기의 환경

• ON 조건이 부착된 환경• 매개 변수들이 존재하지 않음• 예외와 처리기의 바인딩은 동적• 예외 처리기가 실행된 후에 제기된 예외문으로 제어가

리턴되거나 , 종료될 수 있음• 사용자 정의 예외는 임의의 위치로 분기 가능

• 문제점 • 예외가 일어난 후의 처리가 일관성이 없음• 프로그래머가 발생한 예외를 무시하고 계속 프로그램을

실행시킬 수 있으므로 , 결과적으로 비상식적인 경우 발생 가능• 예외 처리기의 동적 바인딩은 이해 어려움• 예외 처리기의 동적 영역 규칙은 예외가 제기된 곳과 문맥상

가까워도 의도하지 않은 채로 예외 처리기가 호출 가능

14

10.3 Ada 의 예외 처리 (1)

• Steelman Requirements - Ada 의 예외 처리에 대한 명세

– 예외 처리 실행 후 , 발생 블록 실행 재개 하지 않음

– 다수의 미리 정의된 (predefined) 예외 제공 - 시스템 환경

• Ada 의 미리 정의된 예외 종류– CONSTRAINT-ERROR : 영역 , 첨자 , 열거형 자료 등에 대한 제한 이탈 , n

ull 접근시

– NUMERIC-ERROR : 연산 결과가 영역을 벗어날 때

– SELECT-ERROR : select 문에서 택일 조건 모두가 만족되지 않을 때

– STORAGE-ERROR : 기억 장소를 할당할 수 없을 때

– TASKING-ERROR : 태스크간에 통신 할 때

15

10.3 Ada 의 예외 처리 (2)

• Ada 의 사용자 정의 예외

– exception 선언문

• 예 ) BAD_FORMAT, TIMEOUT, XXX : exception

• 예외 발생

– 자동 발생 ( 시스템 정의 예외 )

– 사용자 발생 (raise 문 이용 )

• 예 ) raise TIMEOUT

16

10.3 Ada 의 예외 처리 (3)

• 예외 처리 루틴– 시스템 제공 예외 처리

• 사용자 예외 처리 루틴 재 정의 가능 ( 우선 )

– 사용자 정의 예외 처리 루틴 작성 형태<exception-handler> ::=when <exception-choice>{|<exception-choice>} => <statements><exception-choice> ::= <exception-name> | others

– 예외 처리 순서 예외 발생 프로그램 예외 처리 루틴 존재 해당 루틴에서 처리

예외 처리 루틴 부재 caller 로 예외 전파 (dynami

c)

17

10.3 Ada 의 예외 처리 (4)

begin

-- this is a sequence of statements

exception

when NUMERIC_ERROR => -- 수치 오류를 처리하는 작업

when BAD_FORMAT => -- 어떤 예외 처리 작업

when others => -- 위 두 예외를 제외한 모든 예외를

end; 처리하는 작업

begin

-- this is a sequence of statements

exception

when NUMERIC_ERROR => -- 수치 오류를 처리하는 작업

when BAD_FORMAT => -- 어떤 예외 처리 작업

when others => -- 위 두 예외를 제외한 모든 예외를

end; 처리하는 작업

< Ada 예외 처리 루틴 구문 예 >

18

10.3 Ada 의 예외 처리 (5)

1 procedure P is 2 BAD-FORMAT : exceptionexception ; 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 whenexception when BAD_FORMAT => -- handler body 1 BAD_FORMAT => -- handler body 113 end R ;14 begin15 R ;16 Q ;17 exception whenexception when BAD_FORMAT => -- handler body 2 BAD_FORMAT => -- handler body 218 end P ;

1 procedure P is 2 BAD-FORMAT : exceptionexception ; 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 whenexception when BAD_FORMAT => -- handler body 1 BAD_FORMAT => -- handler body 113 end R ;14 begin15 R ;16 Q ;17 exception whenexception when BAD_FORMAT => -- handler body 2 BAD_FORMAT => -- handler body 218 end P ;

< Ada 예외 처리 예 >

19

10.3 Ada 의 예외 처리 (6)

• 예외 사항의 전파– 예외 사항이 발생되었지만 해당 예외 처리기가 없는 경우는 호출한

상위 프로그램으로 제어가 넘어감

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

예외의 전파(Propagation of Exception)

20

10.3 Ada 의 예외 처리 (7)procedure DOSOMETHING is HANDLE_ERROR : exceptionexception ;begin -- perform some set of actions exceptionexception whenwhen HANDLE_ERROR => -- error handing code HANDLE_ERROR => -- error handing code end ;end DOSOMETHING ;function SECURE_DIVIDE(X , Y : REAL) return REAL is begin return X / Y ; exception exception whenwhen NUMERIC_ERROR => NUMERIC_ERROR => returnreturn 0 0 ;; end SECURE_DIVIDE ;procedure COPYOVER is begin OPEN(INFILE) ; OPEN(OUTFILE) ; loop GET(INFILE , CHARACTER) ; PUT(OUTFILE , CHARACTER) ; end loop ; exceptionexception when when END_OF_FILE =>END_OF_FILE => PUT(OUTFILE , EOF)PUT(OUTFILE , EOF) ;; CLOSE(OUTFILE)CLOSE(OUTFILE) ;; CLOSE(INFILE)CLOSE(INFILE) ;;end COPYOVER ;

procedure DOSOMETHING is HANDLE_ERROR : exceptionexception ;begin -- perform some set of actions exceptionexception whenwhen HANDLE_ERROR => -- error handing code HANDLE_ERROR => -- error handing code end ;end DOSOMETHING ;function SECURE_DIVIDE(X , Y : REAL) return REAL is begin return X / Y ; exception exception whenwhen NUMERIC_ERROR => NUMERIC_ERROR => returnreturn 0 0 ;; end SECURE_DIVIDE ;procedure COPYOVER is begin OPEN(INFILE) ; OPEN(OUTFILE) ; loop GET(INFILE , CHARACTER) ; PUT(OUTFILE , CHARACTER) ; end loop ; exceptionexception when when END_OF_FILE =>END_OF_FILE => PUT(OUTFILE , EOF)PUT(OUTFILE , EOF) ;; CLOSE(OUTFILE)CLOSE(OUTFILE) ;; CLOSE(INFILE)CLOSE(INFILE) ;;end COPYOVER ;

< Ada

에서

다양한

예외들의

사용

예 >

21

10.3 Ada 의 예외 처리 (9)

• 예외 발생 억제– pragma SUPPRESS(OVERFLOW_CHECK)

– 이 pragma 의 영역에서는 오버플로우 검사 필요 없음

• 문제점– 예외가 발생할 때 예외 처리 루틴에 매개변수를 전달할 수 없다 . 따라서 프로그래머는 전역 변수를 통해서만 통신할 수밖에 없는데 , 이것은 모듈화에 위배된다 .

– 발생된 예외가 예외 처리 루틴을 찾기 위해 동적 체인의 마지막까지 전파된다 . 만일 프로그래머가 적절한 위치에 예외 처리 루틴을 기술하지 못하면 , 예상하지 못한 곳에서 예외가 처리되어 결국 디버깅이 어렵게 된다 .

22

10.4 C++ 의 예외 처리 (1)

• C++ 의 예외 처리기 형식– try 문 ( 예외 발생 ) 과 다수의 catch 문 ( 예외 처리 루틴 ) 으로 구성

– 예외 발생을 알려주는 객체를 throw 명령으로 예외 처리기에 보냄

– 예외 처리 루틴 catch 문• 함수 형태

• 형식 매개변수 오직 한 개 ( 경우에 따라 생략 가능 )

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

catch (formal parameter) { -- 예외 처리기 몸체부 }

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

catch (formal parameter) { -- 예외 처리기 몸체부 }

23

10.4 C++ 의 예외 처리 (2)

• 사용자 정의 예외만 존재

• 시스템 예외 처리 불가능

• 함수에서 발생할 수 있는 예외의 데이터 형 (throw 에서 사용될 식의 데이터 형 ) 선언 가능– 예 ) int fun() throw (int, char *) { … }

• 예외 처리기와 예외의 바인딩은 정적

• 예외 전파 - 동적 연결 ( 예외 처리기가 없는 예외는 호출한 프로그램으로 전파 )

• 형식매개변수 생략 예외 처리– catchall - Ada 의 others 에 해당

• 명시적 예외 발생– throw 문

24

#include <iostream.h> void main() { // 어떤 예외도 발생 가능 int new_grad, index, limit_1, limit_2, freq [10]; short int eof_condition; try { while (1) {

If (!cin >> new_grade) // cin 이 eof를 만나면 throw eof_condition; // eof_condition 예외 발생index = new_grade /10;{ try { if (index < 0 || index > 9) throw (new_grade) ;

freq [index]++; } //* 내부 try 문 끝

catch (int grade) { // 첨자 오류 처리기 if (grade == 100)

freq [9]++; else

cout << “ Error -- new grade : “ << grade<< “ is out of range “ << end1;

} // catch(int grade) 끝 } // 내부 try 문과 catch 문 쌍 끝 } // while 문 끝 } // 외부 try 문 끝 catch (short int) { // eof 예외 처리기 cout << “ Limits Frequency ” << end1; 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] << end1; } // for 문 끝 } // catch(short int) 끝 } // main 끝

#include <iostream.h> void main() { // 어떤 예외도 발생 가능 int new_grad, index, limit_1, limit_2, freq [10]; short int eof_condition; try { while (1) {

If (!cin >> new_grade) // cin 이 eof를 만나면 throw eof_condition; // eof_condition 예외 발생index = new_grade /10;{ try { if (index < 0 || index > 9) throw (new_grade) ;

freq [index]++; } //* 내부 try 문 끝

catch (int grade) { // 첨자 오류 처리기 if (grade == 100)

freq [9]++; else

cout << “ Error -- new grade : “ << grade<< “ is out of range “ << end1;

} // catch(int grade) 끝 } // 내부 try 문과 catch 문 쌍 끝 } // while 문 끝 } // 외부 try 문 끝 catch (short int) { // eof 예외 처리기 cout << “ Limits Frequency ” << end1; 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] << end1; } // for 문 끝 } // catch(short int) 끝 } // main 끝

10

.4 C

++

예외

처리(3

)

< C

++

예외

처리기

사용

예 >

25

10.5 Java 의 예외 처리 (1)

• 예외 처리의 장점1) 정상적인 코드와 에러처리 코드의 분리2) 호출 스택을 이용하여 에러를 전달3) 에러의 종류와 차이를 이용하여 그룹화 가능

• 예외의 종류– 시스템 정의 예외 (System-defined exception or predefined exceptio

n)• 프로그램의 부적당한 실행에 의한 예외• 비검사 예외 (unchecked exception)• Error와 RuntimeException 클래스 : …

– 프로그래머 정의 예외 (Programmer-defined exception)• 프로그래머에 의도적으로 야기되는 예외• 검사 예외 (checked exception) : 예외 처리기의 존재 여부 검사

26

10.5 Java 의 예외 처리 (2)

RuntimeException

Error Exception

CheckedException

ArithemticException

LinkaqeErrorThreadDeathVirtualMachineError

Object

Throwable

< Throwable 클래스의 계층 구조 >

27

10.5 Java 의 예외 처리 (3)

• 자바 예외 처리기– 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”);

예외 정의

예외 발생

28

10.5 Java 의 예외 처리 (4)

• 예외 처리 바인딩– try 문에서 발생한 경우

• catch 함수의 매개변수• 발생된 예외 객체나 발생된 예외 객체의 조상

– 정적 바인딩 • 내포한 상위 try 구문의 처리기 탐색

– 동적 바인딩 • 메소드의 호출자에게 전파

• Java 의 throw절– C++ 의 throw절과 유사하지만 의미는 전혀 다름 – Java throw절에 있는 예외 클래스 이름의 의미

• 그 예외 클래스 또는 자손 예외 클래스가 그 메소드에 의해서 발생될 수 있다는 것을 지정

29

10.5 Java 의 예외 처리 (5)

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

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

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

나열했는지 또는 메소드에서 처리할 수 있는지를 컴파일러가 확인하는 예외

30

try {while (true) {

system.out.println("Please input a grade");newGrade = Integer.parseInt(in.readLine());if (newGrade < 0)

throw new NegativeInputException();index = newGrade /10;try {

freq[index]++;} //* 안쪽 try절 끝

catch(ArrayIndexOutOfBoundsException) {if (newGrade == 100)

freq[9]++;else

System.out.println("Error - new grade: " +newGrade + " is out of range");

} //** catch(ArrayIndex. .)절 끝. } //** while (true) . . .문 끝} //** 바깥쪽 try절 끝catch(NegativeInputException) {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]);

} //** for 문끝(index =0; . . .} //** catch 문끝(NegativeInputException . . .

} //** method buildDist 끝

import java.io.*;

class NegativeinputException extends Exception { //**자료 끝을 다루는public NegativeInputException() { //** 예외 정의

System.out.println("End of input data reached");} //** 생성자 끝

} //** NegativeInputException 클래스 끝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());if (newGrade < 0)

throw new NegativeInputException();index = newGrade /10;try {

freq[index]++;} //* 안쪽 try절 끝

catch(ArrayIndexOutOfBoundsException) {if (newGrade == 100)

freq[9]++;else

System.out.println("Error - new grade: " +newGrade + " is out of range");

} //** catch(ArrayIndex. .)절 끝. } //** while (true) . . .문 끝} //** 바깥쪽 try절 끝catch(NegativeInputException) {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]);

} //** for 문끝(index =0; . . .} //** catch 문끝(NegativeInputException . . .

try {while (true) {

system.out.println("Please input a grade");newGrade = Integer.parseInt(in.readLine());if (newGrade < 0)

throw new NegativeInputException();index = newGrade /10;try {

freq[index]++;} //* 안쪽 try절 끝

catch(ArrayIndexOutOfBoundsException) {if (newGrade == 100)

freq[9]++;else

System.out.println("Error - new grade: " +newGrade + " is out of range");

} //** catch(ArrayIndex. .)절 끝. } //** while (true) . . .문 끝} //** 바깥쪽 try절 끝catch(NegativeInputException) {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]);

} //** for 문끝(index =0; . . .} //** catch 문끝(NegativeInputException . . .

} //** method buildDist 끝

import java.io.*;

class NegativeinputException extends Exception { //**자료 끝을 다루는public NegativeInputException() { //** 예외 정의

System.out.println("End of input data reached");} //** 생성자 끝

} //** NegativeInputException 클래스 끝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);

10

.5 Ja

va

예외

처리(6

)

31

10.5 Java 의 예외 처리 (7)

• finally 절– 프로세스가 반드시 실행되어야 할 상황 정의– 파일 close

– 메소드에 제공된 외부 자원을 해제

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

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

32

10.5 Java 의 예외 처리 (8)

• 전달해야 하는 예외의 종류를 선택하는 방법1) 이미 만들어진 예외 클래스를 사용2) 사용자가 필요한 예외 클래스를 새로이 작성

• C++ 의 예외 처리보다 개선된 점– 예외가 발생될 수 있는 객체와 프로그램에 있는 모든 다른 객체를 구분– finally 절의 추가로 문장이 종료되는 것에 상관없이 정리 작업이 발생하는 것을 허용– 사용자 예외 처리기에서 처리될 수 있는 여러 가지 시스템 예외를 묵시적으로 발생

top related