• 검색 결과가 없습니다.

10. 예외 처리

N/A
N/A
Protected

Academic year: 2022

Share "10. 예외 처리 "

Copied!
17
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

대 구 가 톨 릭 대 학 교 IT 공학부

소프트웨어공학연구실

10. 예외 처리

(2)

목 차

2

10.1 개요

10.3 Java의 예외처리

10.4 Ada의 예외처리

10.2 C++의 예외 처리

(3)

3

10.1 예외 처리의 개요(1)

예외(exception)

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

예외 처리(exception handling)

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

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

예외 처리기(exception handler)

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

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

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

예외 처리 기능이 없는 언어

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

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

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

(4)

4

10.1 예외 처리의 개요(2)

예외 처리의 역사

1960년대 PL/I에 처음 도입

1970년대 CLU에 의해 크게 발전

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

주요 언어의 예외 처리기

C++

try 블록 뒤에 위치한 catch 절

Java

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

Ada

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

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

(5)

5

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

C++ 예외 처리

미리 정의된 예외가 없음

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

C++의 예외 처리기

예외 발생 영역 : try 블록

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

try { ⋮ }

catch(형식매개변수) { ⋮

}

catch(형식매개변수) { ⋮

}

(6)

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

(7)

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

(8)

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의 다음 반복을 실행

(9)

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

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

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

위의 동작을 반복해도 해당 예외 처리기를 찾지 못할 경우

 terminate() 호출되며 프로그램 실행 종료

9

(10)

10

19.3 Java의 예외 처리(1)

Java 예외 처리

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

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

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

예외 설명

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

Exception

RuntimeException 0으로 나누기, 배열 첨자 범위 초과 등 프로그램 실행 관련 오류 IOException 입출력 과정에서 발생하는 오류

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

예외 설명

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

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

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

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

(11)

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

} }

(12)

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)

(13)

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 클래스를

상속받게 해야 함

(14)

10.3 Java의 예외 처리(5)

finally 절

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

try { ⋮

} catch(⋯) { ⋮

} catch(⋯) { ⋮

} ⋮

finally {

⋮ }

14

(15)

10.4 Ada의 예외 처리(1)

Ada 예외 처리

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

Ada의 미리 정의된 예외

예외 설명

Constraint_Error 배열 첨자 혹은 부분 범위 경계 초과 오류, 오버플로, 0으로 나누기 등으로 발생 Program_Error 선언의 동적 처리에 실패했을 때 발생

Storage_Error 동적 메모리 할당에 실패했을 때 발생 Tasking_Error 병행성 제어 오류에 의해 발생

15

(16)

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

(17)

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

참조

관련 문서

그러나 본 발명은 여기서 설명되는 실시예에 한정되는 것이 아니라 서로 다른 형태로 구체화될 수 도 있다.. 오히려, 여기서 소개되는 실시예는 개시된 내용이 철저하고 완전해질

예를 들어, 단일형으로 설명되어 있는 각 구성 요소는 분산되어 실시될 수도 있으며, 마찬가 지로 분산된 것으로 설명되어 있는 구성 요소들도 결합된 형태로 실시될 수 있다.. 본

이러한 본 발명에 따 른 실시간 운영체제에서 태스크 스케줄링 방법은, 스케줄링 시점이 되면 대기 큐에 존재하는 태스크들 중에 가장 높은 우선순위가 미리 정해진 K인지 판단하는

이들 컴퓨터 프로그램 인스트럭션들은 특정 방식으로 기능을 구현하기 위해 컴퓨 터 또는 기타 프로그램 가능한 데이터 프로세싱 장비를 지향할 수 있는 컴퓨터 이용 가능 또는 컴퓨터

이 경우에도 각 기지국이 일방향 채널로 협력하는 부분에는 본 발명의 실시예가 적용될 수 있다 본 발명의 실시예에서는 일방향 협력 채널을 통해 인접 기지국에 정보를

이러한 외상매입거래에서 매입자는 매입가 액에 10% 의 부가가치세를 포함한 금액에 대해 매

Ø CheckNegative 함수 내에서는 int형, double형 값에 대한 throw문 발생 가능. n bool CheckNegative(int x,

2) 입자밀도 : 입자의 표면을 액체에 침적시켜 입자간에 포함하고 있는 기포를 충분히 제거하 면, 액체는 입자표면의 균열이나 세공에는 침투하지 못한다... • 화학분석의