Developer Factory

31. JAVA Throwable try .. catch 예외처리 본문

Developer/Java

31. JAVA Throwable try .. catch 예외처리

Jeremy.Park 2014. 7. 3. 00:23


예외 처리란?
시스템 실행하는 중에 오류가 발생했을 때 시스템을 계속 실행하게 만드는 문법


1. 호출자에게 보고하지 않고 처리하는 방법

public void Test() {
     try{
          // 소스가 실행 되는 곳 
     } catch (Throwable e) {
          // 예외가 발생 시 조치를 취하는 곳
     }


Test();
// 오류가 발생하더라도 호출자는 모른다.


2. 호출자에게 바로 보고하는 방법. 
     중요한 오류는 처리하지 말고 호출자에게..

public void Test() throws Throwable {
     
}


// 호출하는 메서드가 오류를 던진다고 선언되어 있으면 반드시 try..catch 문을 사용해서 호출해야 된다.
try{
     Test();    // -> 예외가 발생 시 즉시 호출자에게 보고한다.
} catch (Throwable e) {
     // 예외 처리 하는 곳. 중요한 예외는 호출자가 처리된다.
}

3. 선 조치 후 보고 방법.
     중요한 예외 발생 시 보고하기 전에 먼저 오류 처리하고 보고 함.

public void Test() throws Throwable {
     try {

     } catch (Throwable e) {
        // 일단 오류 처리 하고..

        // 호출자에게 오류 내용 보고함
        throw new Throwable("오류내용....");
     }
}



try {
     Test();     // 치명적인 오류 발생 시 내부적으로 처리한 후 보고한다.
} catch (Throwable e) {
     // 예외에 대한 추가 조치를 한다.
}





* 예외를 보고하는 방법
- throw [Throwable 객체]

             public void m() throws Throwable {
                   // 예외 상황이 발생했다 가정!
                   throw new Throwable("오류발생!");
            }
            
             public void m2() throws Exception {
                   throw new Exception("오류발생!");
            }


* Error 계열 또는 RuntimeException 계열은 메서드 선언부에 예외를 선언할 필요가 없다.

             public void m3() throws Error {
                   throw new Error("오호라.. 오류~!" );
            }
            
             public void m4() {
                   throw new RuntimeException("오류!~!");
            }






package basic.exame06.episode2;
/*    예외처리
 * - 시스템 실행하는 중에 오류가 발생했을 때 시스템을 멈추지 않고 적절한 조치 후에
 *     계속 실행하게 만드는 문법
 * - 목적 : 예외 상황 발생 시 시스템을 멈추지 않게 하는 것.
 */

class MyObject {
       // 1. 작은 오류는 보고하지 말고 처리할 것.
       // - 화장실 변기 똥 묻었어~~
       public void 청소하라1(){
             try {
                   // 예외 발생 : 변기 똥 묻다.
            } catch (Throwable e){
                   // 적절한 조치를 취한다.
            }
      }
      
       // 2. 중요한 오류 발생 시 보고할 것
       // - 화장실 변기 깨졌으~~
       // - 중요 오류는 직접 처리하지 말고 호출자에게 보고한다.
       public void 청소하라2() throws Throwable {
          // 중요 예외 발생 : 변기 깨짐..
      }
      
      
       // 3. 중요한 예외 발생. 보고하기 전에 처리 필요가 있음.
       // - 변기 휴지통 불났으~~
       public void 청소하라3() throws Throwable {
             try{
             // 변기 휴지통 불남.
            } catch (Throwable e){
                   // 인단 오류 상황 처리
                  
                   // 호출자에게 오류 내용 보고
                   throw new Throwable("오류내용...");
            }
      }
}

public class ExTest01 {
       public static void main( String[] args) {
             MyObject obj = new MyObject();
             // 호출하는 메서드가 오류를 던진다고 선언되어 있으면
             // 반드시 try..catch 문을 사용해서 호출해야 한다.
             try {
                   obj.청소하라3();   // 치명적인 오류 발생. 내부적으로 처리한 후 보고한다.
    } catch ( Throwable e) {
          // 예외에 대해 추가 조치를 한다.
    }
      }
      

       public static void main02( String[] args) {
             MyObject obj = new MyObject();
             // 호출하는 메서드가 오류를 던진다고 선언되어 있으면
             // 반드시 try..catch 문을 사용해서 호출해야 한다.
             try {
                   obj.청소하라2();   // 예외가 발생하면 즉시 호출자에게 보고한다.   
    } catch ( Throwable e) {
          // 중요한 예외는 호출자가 처리한다.
    }
      }
      
      
       public static void main01( String[] args) {
             MyObject obj = new MyObject();
             obj.청소하라1();   // 청소하라1()에서 오류가 발생하더라도 호출자는 모른다.
             // 호출자가 알 필요도 없는것은 보고할 필요가 없다.
            
      }

}




package basic.exame06.episode2;

public class ExTest02 {

       static class MyObject {
             // 예외를 보고하는 방법
             // - throw [Throwable 객체];
             // - 예외를 보고하는 메서드는 반드시 메서드 선언부에
             // 어떤 예외를 보고하는지 작성해야 함.
             // 문법 : 메서드명() throws 예외클래스명, 예외클래스명, ... {}
             // java.lang.Throwable
             //          -> java.long.Exception (메서드 선언부에 예외 클래스 선언)
             //                : 애플리케이션 예외
             //          -> java.lang.Error (메서드 선언부에 예외 클래스 선언할 필요 없음)
             //                : 시스템 예외
             public void m() throws Throwable {
                   // 예외 상황이 발생했다 가정!
                   throw new Throwable("오류발생!");
            }
            
             public void m2() throws Exception {
                   throw new Exception("오류발생!");
            }
            
             // Error 계열 또는 RuntimeException 계열의 예외 객체는
             // 메서드 선언부에 예외를 선언할 필요가 없다.
             // 물론, 선언해도 상관없다.
             // RuntimeException은 Exception의 자식이다. (내 놓은 자식이다.)
             public void m3() throws Error {
                   throw new Error("오호라.. 오류~!" );
            }
            
             public void m4() {
                   throw new RuntimeException("오류!~!");
            }

            
            
             public void test1()/* throws Exception */{
                  test2();
            }
            
             public void test2()/* throws Exception */{
                  test3();
            }
            
             public void test3()/* throws Exception */{
                   //m2();     // m2()는 Exception을 던지기 때문에 무조건 호출자에게 보고하거나
                                           // try..catch 블록으로 처리해야 한다.
                  m4();  // RuntimeException은 궅이 보고할 필요가 없다. 자동보고!
            }
            
            
      }

      
      
       public static void main( String[] args) {
             MyObject obj = new MyObject();
             // Error나 RuntimeException은 JVM에게 도착하기 전에만 처리하면 된다.
             try{
                   obj.test1();
            } catch(Exception e){
                   // JVM에 전달하지 않고 마지막 단계에서 처리
            }
            
      }


      
       public static void main05( String[] args) /* throws Throwable */ {
             MyObject obj = new MyObject();
             // m(), m2() 메서드는 Throwable, Exception 예외를 던지기 때문에
             // 반드시 try..catch를 사용해야 한다.
             // => 프로그래밍을 하다보면 메서드 -> 메서드 -> 메서드 -> 메서드 이렇게 여러 단계의
             //          걸처 메서드를 호출할 수 있다.
             //          메서드를 호출할 때 마다 .. try ... catch 블록을 써야하거나,
             //          또는 메서드 선언부에 예외 클래스를 선언해야 한다면 무척 피곤할 것이다.
             //          이런 경우 좀 더 가볍게 프로그래밍을 할 수 있도록 RuntimeException을 제공한다.
             obj.m3();    // Error
             obj.m4();    // RuntimeException           
      }

      
       public static void main04( String[] args) throws Throwable {
             MyObject obj = new MyObject();
             // try 블럭에서 부모, 자식 관계를 갖는 예외가 던져진다면,
             // 각각의 예외에 대해 catch 블럭을 여러 개 선언할 수 있다.
             // 단, 자식 예외부터 받는 순서로 catch 블록을 만든다.
            
             try{
                   obj.m();     // Throwable
                   obj.m2();    // Exception
            } catch (Exception e){ // 자식
                  
            } catch (Throwable e){ // 부모
                  
            }
      }

      
       public static void main03( String[] args) throws Throwable {
             MyObject obj = new MyObject();
             try{
                   obj.m();     // Throwable
                   obj.m2();    // Exception
            } catch (Throwable e){
                   // try 블럭에서 부모, 자식 관계를 갖는 예외가 던져진다면,
                   // 부모 참조 변수로 받으면 된다.
            }
      }
      
      
       public static void main02( String[] args) throws Throwable {
             MyObject obj = new MyObject();
             // 예외를 처리하는 방법
             // try .. catch 블럭을 사용한다.
             // - 업무 처리 코드와 예외 처리 코드를 분리할 수 있다.
             // => 코드 가독성이 좋아 진다.
            
             try{
                   obj.m();
            } catch (Throwable e){
                  
            }
      }     
      
       public static void main01( String[] args) throws Throwable {
             MyObject obj = new MyObject();
            
             // Throwable이나 Exception 계열의 예외를 던지는 메서드를 호출할 때는
             // 반드시 try... catch로 예외를 받아야 한다.
             // 예외를 받기 싫으면 다시 호출자에게 넘긴다.
            
             obj.m();    
      }

}


'Developer > Java' 카테고리의 다른 글

30. JAVA Interpace 와 추상 클래스  (0) 2014.07.03
29. JAVA 객체간의 관계 with UML  (0) 2014.07.03
28. JAVA AWT의 hierarchy  (0) 2014.07.03
27. JAVA 상속  (0) 2014.07.03
26. JAVA JavaWindow Programming  (0) 2014.07.03