10 장 예외 (Exceptions). 10-2 예외 (Exceptions) 예외처리는 객체지향적 설계에 있어 중요한 특성이다. 10 장은 다음에 초점을 두고 있다 : 예외의
Chapter 11 – 예외 처리
-
Upload
lee-snider -
Category
Documents
-
view
48 -
download
5
description
Transcript of Chapter 11 – 예외 처리
1
Chapter 11 – 예외 처리
Outline11.1 설계 쟁점11.2 Pl/I 의 예외 처리11.3 Ada 의 예외 처리11.4 C++ 의 예외 처리11.5 java 의 예외 처리
2
11.1 설계 쟁점
• Procedure 의 종료– return ( 정상 ), goto
– overflow, underflow, range error - system interrupt
– EOF 등 예외조건 ( 예상 가능한 조건 )
• 해결 방법– 예외조건 제어 불가능 언어
• 오류 시 약속된 값 반환 - Programmer 매번 check
• 오류 처리 루틴으로 즉시 제어 이동 ( 정상제어 파괴 )
– 예외조건 제어 가능 언어• 사용자 제어 가능• PL/I : 최초 제공 언어• MESA, CLU, Ada, C++, Java : 우아한 방법 제공
3
11.1 설계 쟁점
• 예외 처리– 프로시저들 사이의 정보 교환
• 일반적인 호출 반환과 다름
– 프로시저들간의 특별한 제어 허용
– 예외란 오류가 아님
– 초기 예외 처리• Hardware interrupt routine 을 사용
• system 에서 제공 : 종류 , 처리 루틴
– 예외 처리시 고려해야 할 쟁점들• 어떤 프로시저가 발생된 예외를 처리할 것인가 ?
• 예외 처리 후 예외 발생 프로시저의 활성화 지속 여부 ?
4
11.1 설계 쟁점
• 어떤 프로시저가 발생된 예외를 처리 ?
– 활성화된 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
5
11.1 설계 쟁점
• 예외 처리의 주요 쟁점– System interrupt 접근 방법이 제공되었는가 ?
– System interrupt 를 사용자가 새로 정의하여 우선 시킬 수 있는가 ?
– 사용자 정의 예외가 가능한가 ? 이 예외를 어떻게 발생시키는가 ?
– 가능 예외 (enable exception) 의 영역 규칙은 무엇인가 ?
– 예외 처리 (exception handler) 의 영역은 어디인가 ?
– 예외를 발생시킨 프로시저를 실행 재개시키는가 종결시키는가 ?
– 발생된 예외의 전파 (propagation) 는 어떻게 되는가 ?
– 한 예외에 매개 변수를 사용하여 다양화 시킬 수 있는가 ?
– ( 예기치 않았던 ) 모든 예외를 한번에 자동 처리할 수 있는가 ?
– 예외 처리 루틴에서 예외를 발생 시킬 수 있는가 ? 이 때 후속 처리는 ?
6
11.2 PL/I 의 예외 처리
• 시스템 제공 on condition( 조건 ) 만 사용 가능
• 수치계산 condition : default enable
1. CONVERSION 2. FIXEDOVERFLOW 3. OVERFLOW
4. UNDERFLOW 5. ZERODIVIDE
• Program test condition : default disable
6. SIZE 7. SUBSCRIPTRAGE 8. STRINGRANGE
9. CHECK 10.AREAR
• 입출력 condition : always enable
11. ATTENSION 12. CONDITION 13. ENDFILE
14. ENDPAGE 15. ERROR 16. FINISH
17. KEY 18. NAME 19. PENDING
20. RECORD 21. TRANSMIT 22. UNDEFINITEFILE
7
11.2 PL/I 의 예외 처리
• 예외 조건 상태 제어 ( 가능 /불능 )– enable 선언 : condition 이름 (prefix 사용 )– disable 선언 : NO + condition 이름 (prefix 사용 )– 예 )
(NOUNDERFLOW, STRINGRANGE)
disable enable
• 예외 조건 영역 (scope) – 문장 - 한 문장만이 예외 조건 영역– if 문 - condition field 만 영역 적용 – procedure, begin -end - 해당 블록 (inner 블록은 상속 )
8
11.2 PL/I 의 예외 처리
• 예외 처리 루틴 (Exception Handler)– 표준 시스템 예외 처리 루틴 : default - user overruling 가능– 예외 처리 루틴 사용자 정의
ON condition-name <on-unit><on-unit> : 사용자 정의 예외 처리 루틴 ( 문장 또는 블록 )
• 예외 처리 수행 후 ( 제어 이동 )– 예외를 발생 시킨 문장– 예외를 발생 시킨 문장 다음 문장– handler 에서 별도로 분기 가능
• 예외 발생 (enable 상태 예외만 가능 )– 시스템에서 자동 발생– 사용자 발생
SIGNAL condition-nameSIGNAL condition-name (identifier) : 사용자 정의 예외 취급 가능
9
11.2 PL/I 의 예외 처리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
11.2 PL/I 의 예외 처리
• PL/I ON 문의 문제점– 예외 발생
• 어떤 handler 가 처리 (dynamic link)• 정적 영역을 벗어나므로 예측 불허• 해결책 : 예외 처리 루틴 제공 ( 해당 프로그램 내 )
– 비지역 테이블로 분기 동작 발생 가능 • open 된 file 들을 close 하지 못함
– 계산형 예외 조건 불일치• OVERFLOW, SUBSCRIPTRANGE : 반환 불허• UNDERFLOW, STRINGRANGE : 반환
– disable condition• 조건을 검사하지 않을 뿐• 조건 발생 : 오류로 취급되어 나머지 프로그램 실행 미정의
11
11.3 Ada 의 예외 처리
• Steelman Requirements - Ada 의 예외 처리에 대한 명세
– 예외 처리 실행 후 , 발생 블록 실행 재개 안 함
– 다수의 미리 정의된 (predefined) 예외 제공 - 시스템 환경
• Ada 의 미리 정의된 예외 종류
– CONSTRAINT-ERROR : 영역 , 첨자 , 열거형 자료 등에 대한
제한 이탈 , null 접근 시
– NUMERIC-ERROR : 연산 결과가 영역을 벗어날 때
– SELECT-ERROR : select 문에서 택일 조건 모두가 만족되지 않을
때
– STORAGE-ERROR : 기억 장소를 할당할 수 없을 때
– TASKING-ERROR : 태스크간에 통신 할 때
12
11.3 Ada 의 예외 처리
• Ada 의 사용자 정의 예외
– exception 선언문
– 예 ) BAD_FORMAT, TIMEOUT, XXX : exception
• 예외 발생
– 자동 발생 ( 시스템 정의 예외 )
– 사용자 발생 (raise 문 이용 )
– 예 ) raise TIMEOUT
13
11.3 Ada 의 예외 처리
• 예외 처리 루틴
– 시스템 제공 예외 처리 • 사용자 예외 처리 루틴 재 정의 가능 ( 우선 )
– 사용자 정의 예외 처리 루틴 작성 형태<exception-handler> ::=when <exception-choice>{|<exception-choice>} =>
<statements><exception-choice> ::= <exception-name> | others
– 예외 처리 순서 예외 발생 프로그램 예외 처리 루틴 존재 해당 루틴에서 처리
예외 처리 루틴 부재 caller 로 예외 전파 (dynamic)
예외 처리 후 제어는 예외 처리 루틴이 제공된 프로그램의 caller 로 반환
14
11.3 Ada 의 예외 처리
< Ada 예외 처리 루틴 구문 예 >
begin -- this is a sequence of statements
exceptionwhen NUMERIC_ERROR => -- 수치 오류를 처리하는
작업 when BAD_FORMAT => -- 어떤 예외 처리 작업
when others => -- 위 두 예외를 제외한 모든
예외를 처리하는 작업end;
15
11.3 Ada 의 예외 처리
< 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 ;
16
11.3 Ada 의 예외 처리
• 예외 사항의 전파– 예외사항이 발생되었지만 해당 예외처리기가 없는 경우는 호출한 상위
프로그램으로 제어가 넘어감
예외사항 발생
예외의 전파(Propagation of Exception)
17
11.3 Ada 의 예외 처리
< Ada 예외 전파 사용 예 >
1 procedure A is2 procedure B is3 FLOPPED : exception ;4 begin5 -- sequence of statements6 exception
when FLOPPED => raise end ; begin B ; exception when others => -- handle FLOPPED if possible else raise ; end ;
18
11.3 Ada 의 예외 처리1 procedure DOSOMETHING is 2 HANDLE_ERROR : exception ;3 begin4 -- perform some set of actions5 exception6 when HANDLE_ERROR => -- error handing code7 end ;8 end DOSOMETHING ;9 function SECURE_DIVIDE(X , Y : REAL) return REAL is 10 begin11 return X / Y ;12 exception 13 when NUMERIC_ERROR => return 0 ;14 end SECURE_DIVIDE ;15 procedure COPYOVER is 16 begin 17 OPEN(INFILE) ;18 OPEN(OUTFILE) ;19 loop20 GET(INFILE , CHARACTER) ;21 PUT(OUTFILE , CHARACTER) ;22 end loop ;23 exception24 when END_OF_FILE =>25 PUT(OUTFILE , EOF) ;26 CLOSE(OUTFILE) ;27 CLOSE(INFILE) ;28 end COPYOVER ; < Ada 에서의 다양한 예외들의 사용 예 >
19
11.4 C++ 의 예외 처리• C++ 의 예외 처리기 형식
– try 구성 복합문 ( 예외 발생 ) 과 다수의 catch 복합문 ( 예외 처리 루틴 ) 으로 구성
– 예외 처리 루틴 catch 문
• 함수 형태
• 형식 매개 변수 오직 한 개 ( 경우에 따라 생략 가능 )
try {
-- 예외가 발생하기를 기대하는 코드 }
catch (formal parameter) {
-- 예외 처리기 몸체부 }
. . .
catch (formal parameter) {
-- 예외 처리기 몸체부 }
20
11.4 C++ 의 예외 처리
• 사용자 정의 예외만 존재
• 시스템 예외 처리 불가능 / disable 도 불가능
• 함수에서 발생할 수 있는 예외의 자료형 선언 가능
– 예 ) int fun() throw (int, char *) { … }
• 예외 전파 - 동적 연결
• 형식매개변수 생략형 예외 처리
– catchall - Ada 의 others 에 해당
• 명시적 예외 발생
– throw 문
21• #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 끝
{ 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 문 쌍 끝
22
11.4 Java 의 예외 처리
• 예외의 종류– 시스템 정의 예외 (System-defined exception or
predefined exception)• 프로그램의 부당한 실행에 의한 예외• 비검사 예외 (unchecked exception)• Error 와 RuntimeException 클래스
– ArithmeticException, IOException, IndexOutOfBoundsException, ArrayStoreException, NegativeArraySizeException, NullPointerException, SecurityException, IllegalMonotorException 등…
– 프로그래머 정의 예외 (Programmer-defined exception)• 프로그래머에 의도적으로 야기되는 예외• 검사 예외 (checked exception) : 예외 처리기의 존재 검사
23
11.4 Java 의 예외 처리
RuntimeException
Error Exception
CheckedException
ArithemticException
LinkaqeErrorThreadDeath
VirtualMachineError
Object
Throwable
< Throwable 클래스의 계층 구조 >
24
11.4 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”);
예외 정의
예외 발생
25
11.4 Java 의 예외 처리
• 예외 처리 바운딩– try 구문에서 발생한 경우
• catch 함수의 매개변수• 발생된 예외 객체나 발생된 예외 객체의 조상
– 정적 바인딩 • 내포한 상위 try 구문의 처리기 탐색
– 동적 바인딩 • 메소드의 호출자에게 전파
• Java 의 throw 절– C++ 의 throw 절과 유사하지만 의미는 전혀 다르다 . – Java throw 절에 있는 예외 클래스 이름의 의미
• 그 예외 클래스 또는 후손 예외 클래스가 그 메소드에 의해서 발생될 수 있다는 것을 지정
26
11.4 Java 의 예외 처리
• 비검사 예외– 컴파일러가 전혀 관계하지 않는 예외
– 클래스 Error 와 RuntimeException, 그 후손 클래스들의 예외
• 검사 예외– 메소드에서 발생시킬 수 있는 모든 검사 예외를 throws
절에 나열했는지 또는 메소드에 나열했는지를 컴파일러가 확인하는 예외
27Import java.io.*;Class NegativeinputException extends Exception { //** 자료 끝을 다루는 예의 정의
public NegativeInputException () {System.out.println(“End of input data reached”);
} //** 생성자 끝} //** NegativeInputException 클래스 끝Class GradDist {
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);
} //** method buildDist 끝
Try {while (true) {
systme.out.println(“Please input a grade”);newGrade = Integer.parseInt(in.readLine());if (newGrade < 0)
throw new NegativeInputException();index = newGrade /10;
} //** 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 {freq[index]++;
} //** 안쪽 try 절 끝catch (ArrayIndexOutOfBoundsException) {
if (newGrade ==100)freq[9]++;
elseSystem.out.println(“Error – new grade : “ +
newGrade + “ is out of range”);} //** catch(ArrayIndex..) 절 끝
28
11.4 Java 의 예외 처리
• finally 절– 프로세스가 반드시 실행되어야 할 상황이 존재하는 경우– 폐쇄 (close) 되어야 할 파일– 메소드에 제공된 외부 자원을 해제해야 하는 경우
try { …}catch(…) { …}…//** More handlersfinally { ……}
29
11.4 Java 의 예외 처리
• C++ 의 예외처리보다 개선된 점– 발생될 수 있는 객체와 프로그램에 있는 모든 다른 객체를
구분
– 머리부로부터 발생할 수 있지만 처리하지 않은 예외를 알 수 있다 .
– finally 절의 추가로 복합문이 종료되는 것에 상관없이 청소작업이 발생하는 것을 허용한다 .
– 사용자 예외 처리기에서 처리될 수 있는 여러가지 시스템 예외를 묵시적으로 발생시킨다 .