10. 예외 처리 -...

17
IT 공학부 소프트웨어공학연구실 10. 예외 처리

Transcript of 10. 예외 처리 -...

Page 1: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

대 구 가 톨 릭 대 학 교

IT 공학부

소프트웨어공학연구실

10. 예외 처리

Page 2: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

목 차 2

10.1 개요

10.3 Java의 예외처리

10.4 Ada의 예외처리

10.2 C++의 예외 처리

Page 3: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

3

10.1 예외 처리의 개요(1)

예외(exception)

오버플로나 언더플로, 0으로 나누기, 배열 첨자 범위 이탈 오류와 같이 프로그램 실행 중에 비정상적으로 발생하는 사건

예외 처리(exception handling)

예외가 탐지되었을 때 프로그램의 중단 없이 적절한 행동을 취해 다시 정상적으로 실행되도록 하는 메커니즘

인터럽트 처리 기능을 프로그래밍 언어에서 흉내낸 것

예외 처리기(exception handler)

예외를 처리하는 부분(일련의 코드)

예외 처리 기능을 포함하는 언어

예외가 발생하였을 때 프로그램에서 스스로 예외를 처리하고 다시 정상적으로 실행

예외 처리 기능이 없는 언어

오류가 발생하기 전에 예외를 발견해야 함

프로그래머가 모든 가능한 예외에 대한 검사를 사전에 수행해야 함

예외에 대한 조건 처리와 정상적인 조건 처리를 구분하기가 힘듦

Page 4: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

4

10.1 예외 처리의 개요(2)

예외 처리의 역사

1960년대 PL/I에 처음 도입

1970년대 CLU에 의해 크게 발전

최근 Ada, C++, Java 등의 언어에서는 더욱 고급스러운 방법으로 예외 처리를 제공

주요 언어의 예외 처리기

C++

try 블록 뒤에 위치한 catch 절

Java

try 블록 뒤에 위치한 catch 절이 되는데, 반드시 실행되는 부분인 finally 절을 지원함

Ada

블록, 부프로그램, 패키지, 태스크 등의 마지막 부분에 위치

exception 다음에 when으로 시작되는 형태를 지님

Page 5: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

5

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

C++ 예외 처리

미리 정의된 예외가 없음

C++에서 모든 예외는 명시적으로 발생되어야 함

C++의 예외 처리기

예외 발생 영역 : try 블록

예외 처리기 : try 블록 뒤에 위치한 catch 절

try { ⋮ } catch(형식매개변수) { ⋮ } catch(형식매개변수) { ⋮ }

Page 6: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

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

Catch의 형식 매개변수

처리할 예외의 종류에 해당

int 타입의 예외가 발생할 경우

int 타입을 형식 매개변수로 사용하는 4행의 예외 처리기 실행

double 타입의 예외가 발생할 경우

double 타입을 형식 매개변수로 사용하는 7행의 예외 처리기 실행

01 try {

02 ⋮ 03 }

04 catch(int exception) {

05 ⋮ 06 }

07 catch(double) {

08 ⋮ 09 }

6

Page 7: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

10.2 C++의 예외 처리(3)

명시적으로 예외를 발생시키는 경우 : throw 사용

5행에서 x라는 예외가 발생하면

x가 int 타입이므로 8행의

처리기가 실행

throw x;

01 int x;

02 try {

03 ⋮ 04 if (x < 0)

05 throw x;

06 ⋮ 07 }

08 catch(int) {

09 ⋮ 10 }

11 catch(double) {

12 ⋮ 13 }

7

Page 8: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

10.2 C++의 예외 처리(4)

예외 처리 기능을 사용하는 C++ 예제 01 #include <iostream> 02 using std::cout; 03 using std::cin; 04 using std::endl; 05 06 int main(void) 07 { 08 int numerator, denominator; 09 10 cout << "two integers : “; 11 12 while(cin >> numerator >> denominator) { 13 try { 14 if (denominator == 0) 15 throw denominator; 16 cout << "quotient: " << numerator/denominator << endl; 17 cout << "remainder: " << numerator%denominator << endl; 18 } 19 catch(int) { 20 cout << "Exception occurred: divide by zero" << endl; 21 } 22 } 23 24 return 0; 25 }

8

분모인 denominator가 0 이면

15행에서 예외를 발생시켜

19행에서 예외 처리

예외 처리가 끝나면 while의

다음 반복을 실행

Page 9: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

10.2 C++의 예외 처리(5)

임의의 부프로그램에서 발생한 예외 처리기가 해당 부프로그램에 없을 경우

① 호출 프로그램으로 예외가 전파되어 예외에 대한 처리기를 탐색

② 위의 동작을 반복해도 해당 예외 처리기를 찾지 못할 경우 terminate() 호출되며 프로그램 실행 종료

9

Page 10: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

10

19.3 Java의 예외 처리(1)

Java 예외 처리

미리 정의된 예외가 있고, 사용자가 직접 예외를 정의할 수도 있음

Java 예외는 Throwable 클래스의 하위 클래스 객체임

Java의 대표적인 미리 정의된 예외

예외 설명

Error 메모리 고갈과 같은 자바 가상 머신에 의해 제기되는 오류

Exception

RuntimeException 0으로 나누기, 배열 첨자 범위 초과 등 프로그램 실행 관련 오류

IOException 입출력 과정에서 발생하는 오류

사용자 정의 예외 사용자가 직접 정의하는 예외

예외 설명

ArithmeticException 0으로 나누기 등의 산술적 오류에 의해 발생한다.

ArrayIndexOutOfBoundsException 배열 첨자 범위 경계 초과 오류에 의해 발생한다.

NegativeArraySizeException 배열의 크기를 음수로 지정했을 때 발생한다.

NullPointerException null 객체에 접근할 때 발생한다.

Page 11: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

10.3 Java의 예외 처리(2)

예외가 발생하는 Java 예제 1

0으로 나누려는 프로그램 --> 오류 메시지를 출력하고 프로그램 실행 종료됨

Exception in thread "main" java.lang.ArithmeticException: / by zero at division.main(division.java:6)

try~catch를 사용하면 사용자가 직접 예외 처리 기능을 설정할 수 있음

11

public class division { public static void main(String[] args){ int numerator, denominator; numerator = 7; denominator = 0; System.out.println(numerator/denominator); } }

Page 12: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

12

예외가 발생하는 Java 예제 2

7행에서 ArithmeticException 예외가 발생

ArithmeticException 예외 처리기에 해당하는 10행이 실행

01 public class divisionException { 02 public static void main(String[] args){ 03 int numerator, denominator; 04 numerator = 7; 05 denominator = 0; 06 try { 07 System.out.println(numerator/denominator); 08 } 09 catch(ArithmeticException ae) { 10 System.out.println("Exception occurred: divide by zero"); 11 } 12 } 13 }

10.3 Java의 예외 처리(3)

Page 13: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

10.3 Java의 예외 처리(4)

사용자가 발생시키는 예외

사용자 정의 예외를 사용하는 Java 예제

throw new myException( ) ;

public class myException extends Exception

01 public class myException extends Exception { 02 public static void main(String[] args) { 03 int age; 04 try { 05 age = 5; 06 if (age < 6) 07 throw new myException(); 08 System.out.println("age is " + age); 09 } 10 catch(myException me) { 11 System.out.println("very infant"); 12 } 13 } 14 }

13

예외를 발생시키는 문장

예외 클래스의 최상위 클래스인 Exception 클래스를

상속받게 해야 함

Page 14: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

10.3 Java의 예외 처리(5)

finally 절

try 절에서 예외가 발생하든 그렇지 않든 finally 절은 반드시 실행

try { ⋮ } catch(⋯) { ⋮ } catch(⋯) { ⋮ } ⋮ finally { ⋮ }

14

Page 15: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

10.4 Ada의 예외 처리(1)

Ada 예외 처리

미리 정의된 예외가 있고, 사용자가 직접 예외를 정의할 수도 있음

Ada의 미리 정의된 예외

예외 설명

Constraint_Error 배열 첨자 혹은 부분 범위 경계 초과 오류, 오버플로, 0으로 나누기 등으로 발생

Program_Error 선언의 동적 처리에 실패했을 때 발생

Storage_Error 동적 메모리 할당에 실패했을 때 발생

Tasking_Error 병행성 제어 오류에 의해 발생

15

Page 16: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

10.4 Ada의 예외 처리(2)

예외 처리 기능이 없는 Ada 예제

실행 시 5를 입력하면 오류 메시지를 출력하고 프로그램 실행이 종료

with TEXT_IO; use TEXT_IO; procedure rangeError is package INT_IO is new TEXT_IO.INTEGER_IO (integer); use INT_IO; x: integer range 1..3; begin put("integer: "); get(x); put(x); end rangeError;

integer: 5 raised CONSTRAINT_ERROR

16

Page 17: 10. 예외 처리 - contents.kocw.netcontents.kocw.net/KOCW/document/2014/deagucatholic/kimhangkon/10.pdf · 10.4 Ada의 예외 처리(3) Ada 예외 처리기 블록, 부프로그램,

10.4 Ada의 예외 처리(3)

Ada 예외 처리기

블록, 부프로그램, 패키지, 태스크 등의 마지막 부분에 위치

exception 다음에 when으로 시작되는 형태

만약, 2행에서 발생한 예외가 예외이름1, 예외이름2에 해당하면 실행이 종료되지 않고 예외 처리부분인 5행 또는 7행의 내용을 실행

이 블록은 정상적으로 처리된 것으로 간주, 블록 다음 부분으로 넘어감

01 begin 02 ⋮ 03 exception 04 when 예외이름1 => 05 문장들 06 when 예외이름2 => 07 문장들 08 end;

17