Try-Catch문이란?

- JAVA는 컴파일, 실행시 예외가 발생하면 에러로그와 함께 동작을 멈춥니다. 물론 혼자 공부할 때나 프로젝트를 실행하는 것이라면 문제가 안되지만. 현업에서 예외처리를 안했을 때 서버가 동작을 멈춰버리면 기업입장에서 엄청난 손해를 보게 될 것입니다. 이런 이유로 예외처리라는 것이 존재하며, 그 중 하나의 방법인 Try-Catch문의 간단한 예제와 설명을 적어두려 합니다.

 

Try-Catch문의 기본 구조

	try{
 	  실행문
	}catch(발생되는 exception e){
	  예외처리
	}finally{
      마지막에 무조건 실행할 구문
    }

위의 구조를 살펴보시면 try에는 실행할 구문을 입력하고, catch에서는 try문에서 나올 것으로 예측되는 예외를 처리합니다. finally에 들어가는 구문은 예외가 발생되어도 실행됩니다. 이제부터 예제를 살펴보겠습니다.

 

우선 정수가아닌 문자를 숫자로 바꿀 때 일어나는 NumberFormatException을 임의로 발생시키고, try-catch문이 없으면 어떻게되는지 살펴보겠습니다.

public class TryCatch {
    public static void main(String[] args) {
        String a = "1가"; // 문자 선언
        
        int num = Integer.parseInt(a);

        System.out.println("변환 완료");
    }
}

이 코드를 실행시키면 다음과 같은 결과가 나옵니다.

예상했던대로 예외가 발생했습니다. 또한 맨 밑의 변환 완료는 실행되지 않고 프로그램이 종료되었습니다.

여기서 try-catch문을 적용해보겠습니다.

 

public class TryCatch {
    public static void main(String[] args) {
        String a = "1가"; // 문자 선언

        try {
            int num = Integer.parseInt(a);
        }catch (NumberFormatException e){
            System.out.println("숫자변환에러");
        }finally {
            System.out.println("예외가 발생되어도 실행");
        }

        System.out.println("변환 완료");
    }
}

해당 코드는 "1가"를 숫자로 변환하는 것을 시도할 것이며, NumberFormatException이 발생되면 "숫자변환에러"를 출력하고, 마지막엔 무조건 "예외가 발생되어도 실행"을 찍어낼 것입니다. 또한 예외처리를 한 후 다음 로직도 실행하기때문에 "변환 완료" 라는 문장도 이상없이 출력될 다음은 실행 결과입니다.

 

예상한 대로 모두 실행 되었습니다. 그러나 항상 모든 구문에서 발생되는 예외를 알 수는 없습니다. 그럴 땐 Exception객체를 사용하면 됩니다.

public class TryCatch {
    public static void main(String[] args) {
        String a = "1가"; // 문자 선언

        try {
            int num = Integer.parseInt(a);
        }catch (Exception e){ // 모든 예외를 잡아내도록 변경
            System.out.println("숫자변환에러");
        }finally {
            System.out.println("예외가 발생되어도 실행");
        }

        System.out.println("변환 완료");
    }
}

결과는 처음 실행한 것과 같습니다.

그러나 무조건 Exception으로 잡는 것은 좋지 않습니다. 보통 예외가 발생하면 해당 기능은 작동이 불가능 한 것이므로, 로그를 남기는게 대부분인데 그럴 경우 exception으로만 잡으면 무슨 예외가 발생했는지 알기 어렵습니다. 따라서 다음과 같이 처리합니다.

public class TryCatch {
    public static void main(String[] args) {
        String a = "1가"; // 문자 선언

        try {
            int num = Integer.parseInt(a);
        }catch (NumberFormatException e){ // 의심가는 예외 먼저 처리
            System.out.println("숫자 변환 에러");
        } catch (Exception e){ // 그 외의 예외발생시 처리
            System.out.println("에러");
        }finally {
            System.out.println("예외가 발생되어도 실행");
        }

        System.out.println("변환 완료");
    }
}

System.out.println이 로그를 남기는 구문이라고 치고, 이렇게 되면 NumberFormatException은 로그에 "숫자 변환 에러"라고 남을 것이고, 다른 예외가 발생하면 로그에 "에러" 가 남을 것입니다. 코드에 따라 더 세분화하면 디버깅을 더 쉽게 하실수 있겠죠?

 

마지막으로 주의점 하나가 있습니다. NumberFormatException과 같은 세부적인 예외에 대한 catch문은 항상 Exception위에 놓아야합니다. 잘못된 예시 코드입니다.

public class TryCatch {
    public static void main(String[] args) {
        String a = "1가"; // 문자 선언

        try {
            int num = Integer.parseInt(a);
        } catch (Exception e){ // 모든 예외를 처리함
            System.out.println("에러");
        } catch (NumberFormatException e){ // 절대 catch되지않음
            System.out.println("숫자 변환 에러");
        }finally {
            System.out.println("예외가 발생되어도 실행");
        }

        System.out.println("변환 완료");
    }
}

Exception은 모든 예외의 부모클래스이기 때문에, NumberFormatException역시 잡아냅니다. 때문에 아래의 NumberFormatException은 절대로 catch문이 실행되지않습니다. IDE에서도 바로 에러가 발생하는데요. 

Exception에서 잡힌다.

때문에 항상 Exception은 코딩시 마지막에 넣어주어야합니다. 이상으로 try-catch문에 대한 포스팅을 마치겠습니다.

긴 글 읽어주셔서 감사합니다.

+ Recent posts