JAVA

[Java] Exception - Exception handling | 예외처리

엘라 ELLA 2022. 10. 11. 21:50
728x90
반응형

에러 발생 시점에 따라서 세가지 정도로 나눌 수 있다.

 

  • 컴파일 에러 (compile- time error) - 컴파일 시에 발생하는 에러
  • 런타임 에러 (runtime error) - 실행 시에 발생하는 에러
  • 논리적 에러 (logical error) - 실행은 되지만, 의도와 다르게 동작하는 것(예를 들어, 통장의 잔고가 음수로 표현)

예외처리의 목적

예외의 발생으로 인한 실행중인 프로그램의 갑작스러운 비정상 종료를 막고, 정상적인 실행상태를 유지할 수 있도록 하는것이다.

 

예외처리를 해주지 못하면 프로그램이 비정상적으로 종료되면서 JVM의 '예외처리기(UncaughtExceptionHandler)'가 받아서 예외의 원인을 화면에 출력한다.


 

예외처리하기

 - try - catch문

 

구조

try {
	//예외가 발생할 가능성이 있는 문장
} catch (Exception1 e1) {
	//Exception1이 발생 했을 때, 처리 할 문장
} catch (Exception2 e2) {
	//Exception2이 발생 했을 때, 처리 할 문장
} catch (ExceptionN eN) {
	//ExceptionN이 발생 했을 때, 처리 할 문장
}

하나의 try 블럭에 여러 종류의 catch블럭이 올 수 있으며, 일치하는 단 한가지의 catch 블럭만 수행한다. 예외의 종류와 일치하는 catch 블럭이 없으면, 예외는 처리되지 않는다.

 

try-catch-finally블록도 있다.

try{
	//예외 발생 가능 코드
} catch (Exception e){
	//예외 처리
} finally {
	항상 실행;
}

try-catch-finally 블록에서는 try블록 안의 내용이 예외 없이 실행되면, catch블록은 실행되지 않고 finally블록이 실행된다. 만약, try블록에서 예외가 발생된다면 catch블록 실행 후에 finally블록이 실

 

Web 개발 프로젝트에서 사용된 예시

try {
      if (!idx.equals(dto.getIdx())) {
        return Response.Err(HttpStatus.BAD_REQUEST, "본문과 요청IDX 상이함");
      }
      if (!CronExpression.isValidExpression(dto.getCrontab())) {
        return Response.Err(HttpStatus.BAD_REQUEST, "크론탭 형식 오류");
      }
      if (!CommonUtil.isValidUrl(dto.getUrl())) {
        return Response.Err(HttpStatus.BAD_REQUEST, "URL 형식 오류");
      }

try - catch문의 실행 순서

 

➜ try 블럭 내에서 예외가 발생 한 경우

1. 일치하는 catch 블럭이 있는지 찾는다.

2. 일치하는 catch 블럭이 있으면 해당 블럭 내의 문장을 수행한다. 후에 try-catch문 전체를 빠져나가 다음줄을 실행한다.

2-1) 일치하는 catch 블럭을 찾지 못하면, 예외는 처리되지 않는다.

 

➜ try블럭 내에서 예외가 발생 하지 않은 경우

1. catch 블럭을 거치지 않고 전체 try-catch문을 빠져나가서 다음 줄을 실행한다.


printStackTrace()와 getMessage()

 

 printStackTrace()

예외 발생 당시의 호출스택이 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.

getMessage()

발생한 예외클래스의 인스턴스에 저장된 메세지를 가지고 온다.

 

사용 예시 (getMessage())

public class test {
    public static void main(String[] args) {
        System.out.println(1);
        System.out.println(2);

        try {
            System.out.println(3);
            System.out.println(0/0); //예외발생
            System.out.println(4);
        } catch (ArithmeticException ae){
            ae.printStackTrace();
            System.out.println("예외메세지:" + ae.getMessage());
        }
        System.out.println(6);
    }
}

실행 결과

1
2
3
예외메세지:/ by zero
6
java.lang.ArithmeticException: / by zero
	at test.test.main(test.java:10)

 


멀티 catch블럭

JDK 1.7부터 지원하는 '|' 기호를 이용한 하나의 catch 블럭을 합칠 수 있게 하는것입니다.

* 만일 멀티 catch블럭의 '|'기호로 연결된 예외 클래스가 조상과 자손의 관계에 있으면 컴파일 에러가 납니다.(그냥 조상클래스만 써주는것과 똑같기 때문에 중복코드는 제거하라는 의미의 에러입니다.)

 

사용 전 코드

try {
	...
} catch (ExceptionA e) {
	e.printStackTrace();
} catch (ExceptionB e2) {
	e.printStackTrace();
}

➜사용 후 코드

try {
	...
} catch (ExceptionA | ExceptionB) {
	e.printStackTrace();
}

예외 발생시키기

"throw"를 사용해서 고의로 예외를 발생시킬 수 있다.

1. new를 이용해서 발생시키려는 예외 클래스의 객체를 만든다.

Exception e = new Exception("고의로 발생시킨 부분");

2. throw를 이용해서 예외를 발생시킨다.

throw e;

* 위의 두 줄을 한줄로 줄여쓰면 아래와 같다.

throw new Exception("고의로 발생시킨 부분");

메서드에 예외 선언하기

 

➜ try-catch문을 사용하는것 이외에 메서드에 선언 하는 방법이 있다.

void method() throws Exception1, Exception2, ... ExceptionN{
	//메서드의 내용
}

 

 

반응형