10. 예외처리 대구가톨릭대학교 IT 공학부 소프트웨어공학연구실
목차 2 10.1 개요 10.2 C++ 의예외처리 10.3 Java 의예외처리 10.4 Ada 의예외처리
10.1 예외처리의개요 (1) 3 예외 (exception) 오버플로나언더플로, 0 으로나누기, 배열첨자범위이탈오류와같이프로그램실행중에비정상적으로발생하는사건 예외처리 (exception handling) 예외가탐지되었을때프로그램의중단없이적절한행동을취해다시정상적으로실행되도록하는메커니즘 인터럽트처리기능을프로그래밍언어에서흉내낸것 예외처리기 (exception handler) 예외를처리하는부분 ( 일련의코드 ) 예외처리기능을포함하는언어 예외가발생하였을때프로그램에서스스로예외를처리하고다시정상적으로실행 예외처리기능이없는언어 오류가발생하기전에예외를발견해야함 프로그래머가모든가능한예외에대한검사를사전에수행해야함 예외에대한조건처리와정상적인조건처리를구분하기가힘듦
10.1 예외처리의개요 (2) 4 예외처리의역사 1960 년대 PL/I 에처음도입 1970 년대 CLU 에의해크게발전 최근 Ada, C++, Java 등의언어에서는더욱고급스러운방법으로예외처리를제공 주요언어의예외처리기 C++ try 블록뒤에위치한 catch 절 Java try 블록뒤에위치한 catch 절이되는데, 반드시실행되는부분인 finally 절을지원함 Ada 블록, 부프로그램, 패키지, 태스크등의마지막부분에위치 exception 다음에 when 으로시작되는형태를지님
10.2 C++ 의예외처리 (1) 5 C++ 예외처리 미리정의된예외가없음 C++ 에서모든예외는명시적으로발생되어야함 C++ 의예외처리기 try { catch( 형식매개변수 ) { catch( 형식매개변수 ) { 예외발생영역 : try 블록 예외처리기 : try 블록뒤에위치한 catch 절
10.2 C++ 의예외처리 (2) 6 Catch 의형식매개변수 처리할예외의종류에해당 예 01 try { 02 03 04 catch(int exception) { 05 06 07 catch(double) { 08 09 int 타입의예외가발생할경우 int 타입을형식매개변수로사용하는 4 행의예외처리기실행 double 타입의예외가발생할경우 double 타입을형식매개변수로사용하는 7 행의예외처리기실행
10.2 C++ 의예외처리 (3) 7 명시적으로예외를발생시키는경우 : throw 사용 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 5 행에서 x 라는예외가발생하면 x 가 int 타입이므로 8 행의 처리기가실행
10.2 C++ 의예외처리 (4) 8 예외처리기능을사용하는 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 분모인 denominator 가 0 이면 15 행에서예외를발생시켜 19 행에서예외처리예외처리가끝나면 while 의다음반복을실행
10.2 C++ 의예외처리 (5) 9 임의의부프로그램에서발생한예외처리기가해당부프로그램에없을경우 1 2 호출프로그램으로예외가전파되어예외에대한처리기를탐색 위의동작을반복해도해당예외처리기를찾지못할경우 terminate() 호출되며프로그램실행종료
19.3 Java 의예외처리 (1) 10 Java 예외처리 미리정의된예외가있고, 사용자가직접예외를정의할수도있음 Java 예외는 Throwable 클래스의하위클래스객체임 예외 설명 Error 메모리고갈과같은자바가상머신에의해제기되는오류 Exception RuntimeException IOException 0 으로나누기, 배열첨자범위초과등프로그램실행관련오류 입출력과정에서발생하는오류 사용자정의예외 Java 의대표적인미리정의된예외 사용자가직접정의하는예외 예외 설명 ArithmeticException 0으로나누기등의산술적오류에의해발생한다. ArrayIndexOutOfBoundsException 배열첨자범위경계초과오류에의해발생한다. NegativeArraySizeException 배열의크기를음수로지정했을때발생한다. NullPointerException null 객체에접근할때발생한다.
10.3 Java 의예외처리 (2) 11 예외가발생하는 Java 예제 1 public class division { public static void main(string[] args){ int numerator, denominator; numerator = 7; denominator = 0; System.out.println(numerator/denominator); 0 으로나누려는프로그램 --> 오류메시지를출력하고프로그램실행종료됨 Exception in thread "main" java.lang.arithmeticexception: / by zero at division.main(division.java:6) try~catch 를사용하면사용자가직접예외처리기능을설정할수있음
10.3 Java 의예외처리 (3) 12 예외가발생하는 Java 예제 2 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 7 행에서 ArithmeticException 예외가발생 ArithmeticException 예외처리기에해당하는 10 행이실행
10.3 Java 의예외처리 (4) 13 사용자가발생시키는예외 예외를발생시키는문장 throw new myexception( ) ; public class myexception extends Exception 예외클래스의최상위클래스인 Exception 클래스를상속받게해야함 사용자정의예외를사용하는 Java 예제 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
10.3 Java 의예외처리 (5) 14 finally 절 try 절에서예외가발생하든그렇지않든 finally 절은반드시실행 try { catch( ) { catch( ) { finally {
10.4 Ada 의예외처리 (1) 15 Ada 예외처리 미리정의된예외가있고, 사용자가직접예외를정의할수도있음 Ada 의미리정의된예외 예외 Constraint_Error Program_Error Storage_Error Tasking_Error 설명 배열첨자혹은부분범위경계초과오류, 오버플로, 0으로나누기등으로발생선언의동적처리에실패했을때발생동적메모리할당에실패했을때발생병행성제어오류에의해발생
10.4 Ada 의예외처리 (2) 16 예외처리기능이없는 Ada 예제 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; 실행시 5 를입력하면오류메시지를출력하고프로그램실행이종료 integer: 5 raised CONSTRAINT_ERROR
10.4 Ada 의예외처리 (3) 17 Ada 예외처리기 블록, 부프로그램, 패키지, 태스크등의마지막부분에위치 exception 다음에 when 으로시작되는형태 01 begin 02 03 exception 04 when 예외이름1 => 05 문장들 06 when 예외이름2 => 07 문장들 08 end; 만약, 2 행에서발생한예외가예외이름 1, 예외이름 2 에해당하면실행이종료되지않고예외처리부분인 5 행또는 7 행의내용을실행 이블록은정상적으로처리된것으로간주, 블록다음부분으로넘어감