IT/JAVA

예외처리

iamhyeon 2024. 9. 25. 10:12

- 프로그램적으로 에러가 아니더라도 로직상 개발자가 일부러 에러를 내서 로그에 기록하고 싶은 상황이 올 수 있다.

- 예외처리를 분산하여 어디에서 에러가 난 것인지 원인을 보다 쉽게 파악할 수 있다.

- 에러에 대한 처리는 웹 보안에 있어서 매우 중요하다.


 

[ sysntax error ]

컴파일 불가능한 상태로,  실행이 안된다

 

[ runtime error ]   

실행중 발생하는 에러

문법적으로 잘못된건 없어     컴파일은 되지만     실행은 안된다


< try~ catch~ finally >

try ->  에러  ->  catch   e에 담김   ->   finally

필요없으면 finally 생략 가능

일부러 에러를 내는 것이므로, 프로그램적으로 문제가 있는 것이 아니여서   프로그램이 뻗진 않는다

 

/**
 * 1) 파일 복사를 수행하는 기능에서 하드디스크의 용량이 가득 찬 경우
 * 2) 다운로드를 수행하는 기능에서 인터넷 접속이 끊긴 경우
 * 3) USB에 파일을 저장하는 과정에서 USB의 연결이 강제로 해제된 경우
 * 
 * 위와 같은 상황은 if문으로 해결이 어렵기 때문에
 * 자바에서는 예외 상황에 대처하기 위한 try catch finally 문법 제공
 */

public class Ex03_예외처리 {
    public static void main(String[] args) {
        
        int[] k = {10,20,30};

        try {
            //  에러가 발생할 것으로 예상되는 코드를 try블록으로 감싸기
            for ( int i=0; i<5; i++ ) {
                System.out.println(k[i]);
            }
        } catch (Exception e) {
                /** try 블록 안에서 에러가 발생하는 경우 실행되는 블록
                 * try 는 항상 catch와 함께 명시돼야 함
                 * try 블록 수행하는 과정에서 에러 발생하면 프로그램 다운되지 않고 그 즉시 catch블록으로 제어가 이동된다
                 */
                System.out.println("에러 발생");
                System.out.println("에러 원인: " + e.getMessage());

                //  시스템에 의해 출력되는 에러메시지 전문을 강제로 출력
                System.out.println("====================");
                e.printStackTrace();
                System.out.println("====================");
        } finally {
            //  에러 발생 여부에 상관없이 무조건 실행되는 블록
            //  생략가능
            System.out.println("finish");
        }
        System.out.println("---FIN---");
    }
}

e.getMessage()

e.printStackTrace()

 

public class Ex04_에러상황의_세분화 {
    public static void main(String[] args) {
        int[] data = {100,200,300};

        try {
            for (int i=2; i>=-1; i--) {
                int k = i!=0? data[i]/i : i;
                System.out.println(k);
            }
        } catch (ArrayIndexOutOfBoundsException e1) {
            //  에러의 경우에 수에 따라 여러개 정의하면 상황별로 에러 구분하여 대응할 수 있다
            System.out.println("배열의 인덱스를 초과했습니다");
        } catch (ArithmeticException e2) {
            System.out.println("잘못된 연산입니다");
        } catch (Exception e) {
            // Exception 클래스는 Java의 모든 예외 클래스에 대한 최상위 클래스
            // Exception 객체를 선언하여 모든 에러 상황들이 Exception 형태로 암묵적 형변환 된다
            // 모든 예외상황에 대응한 후 마지막에 알 수 없는 에러에 대한 대비책으로 명시해 둘 수 있다
            System.out.println("알 수 없는 에러 발생");
            System.out.println(e.getMessage());
        } finally {
            System.out.println("---FIN---");
        }
    }
}

 

 

- Exception 클래스는 Java의 모든 예외 클래스에 대한 최상위 클래스다
- Exception 객체를 선언하여 모든 에러 상황들이 Exception 형태로 암묵적 형변환 된다
- 모든 예외상황에 대응한 후 마지막에 알 수 없는 에러에 대한 대비책으로 명시해 둘 수 있다


throw 명령은 try~catch 구문으로 감싸지거나
throw 명령을 사용하는 메서드는 throws를 통해 강제로 발생하는 에러에 대한 처리를 호출하는 위치로 떠넘겨야 한다

 

throws Exception 걸린 메서드는 반드시 try catch 해야한다

(Ctrl+.)   빠른수정   >  surround with try/catch

 

내장기능은 다 throws Exception 이 걸려있다

 

'IT > JAVA' 카테고리의 다른 글

Helper  (0) 2024.09.26
패키지와 라이브러리  (0) 2024.09.25
static  (0) 2024.09.24
인터페이스  (0) 2024.09.24
입출력  (0) 2024.09.10