JAVA

자바 예외 다루기 - 에러 처리 방식

앞선 글에서 에러와 예외에 대해서 다루었습니다. 이번에는 예외를 어떻게 처리하는지 어떻게 다루는지에 대해서 정리해보고자 합니다.

 

예외를 다르는 방법으로는 3가지 정도가 있습니다.

우선 처리하기 전에 간단한 샘플 코드를 만들어 보면

 

1. 호출을 받는 클래스로 예외가 발생합니다.

@Service
@Slf4j
@RequiredArgsConstructor
public class TransactionService {

	...

    public void getException() {
        throw new TestException();
    }
}

 

2. 호출하는 클래스

@Service
@Slf4j
@RequiredArgsConstructor
public class TestObjectService {

    private final TransactionService transactionService;

	...

    public void tryCatch() {
        transactionService.getException();
    }
}

 

3. 테스트 코드

@SpringBootTest
class TestObjectServiceTest {

    @Autowired
    TestObjectService testObjectService;

	...

    @Test
    public void tryCatchTest() {
        TestException thrown = assertThrows(TestException.class, () -> testObjectService.tryCatch());
        assertEquals("테스트 예외입니다.", thrown.getMessage());
    }
}

1. 예외 복구- try/catch 문을 통해서 예외를 잡아서 처리하여 예외 상황을 종료

- try/catch문 안에 익셉션 발생 가능한 코드를 넣고 해당 예외를 잡아서 처리하는 방식

 

호출하는 클래스에 try/catch문을 적용합니다.

@Service
@Slf4j
@RequiredArgsConstructor
public class TestObjectService {

    private final TransactionService transactionService;

	...

    public void tryCatch() {
        try {
            transactionService.getException();
        }catch (TestException e) {
            e.printStackTrace();
        }
    }
}

 

테스트를 돌려보면 아래와 같이 나오는데 위부분은 e.printStackTrace 부분이고 

아래는 테스트 코드 부분으로 내용은 TestException이 던져질거라고 기대했는데 아무것도 던져지지 않았다라는 의미입니다.

즉 try/catch 문에서 에러를 잡아서 처리하기 때문에 던져지는게 없었고 테스트가 실패하게 됩니다.

 

 

2. 예외처리 회피 - 떠넘기기

- throws 키워드를 메서드의 선언부 끝에 작성한다.

- 해당 메서드에서 처리하지 않은 예외를 호출한 곳으로 예외처리를 떠넘기게 된다.

 

실제 사용해보면 아시겠지만 RuntimeException 혹은 이를 상속받아서 만든 커스텀 예외는 IDE에서 아래처럼 빨간줄이 안뜨는데

다른 Exception에서 아래처럼 빨간줄이 뜨는 걸 경험하실 텐대

이는 Checked, Unchecked Exception 에 따른 것으로  예외 처리가 필수인 경우 빨간줄을 통해서 에러처리를 하지 않으면 컴파일 안된다라는 것을 IDE에서 알려주는 것입니다.

그리고 이때 위와 같이 throws를 통해서 호출자에게 에러를 떠넘길수 있습니다.

 

여기서 오해하시는 부분이 unchecked Exception은 에러 처리를 할수도 안할수도 있기 때문에 안 적을뿐 실제로는 발생 메서드에서 try/catch를 하지않는 다면 호출자로 에러가 떠넘겨집니다. 호출자 끝까지 올라갔을 때 처리가 안되도 상관없을 뿐입니다. 

 

3. 예외 전환 - 되던지기

- 하나의 예외 처리에 다른 예외을 던지는 것을 의미

- 하나의 메서드에서 여러 예외가 발생할때 유용하게 사용할 수 있다.

 

호출자 메서드와 테스트를 아래와 같이 수정 후 테스트를 실행합니다.

 

윗부분은 printStackTrace로 TestException에 대한 내용을 담고 있습니다.

아래부분은 되던저진 RuntimeException에 대한 내용을 담고 있습니다. 

 

그래서 아래처럼 테스트 코드를 수정하면 테스트가 성공하게 됩니다.

다만 아래 처럼 printStackTrace는 출력됩니다. 이 부분은 에러가 발생했고 이를 찍어보는 부분으로 정상적이라고 보시면됩니다.

 

스프링에서는 이러한 에러를 @ControllerAdvice와 @ExceptionHandler이용한다. 해당 내용은 스프링 카테고리에서 다루도록 하겠습니다 .ㅎ

'JAVA' 카테고리의 다른 글

자바 Enum 활용  (0) 2021.06.06
자바 final 키워드  (0) 2021.06.05
Error 와 Exception(Checked, Unchecked)  (0) 2021.05.31
Queue 구현 해보기 (자바)  (0) 2021.05.24
Stack 구현 해보기 (자바)  (0) 2021.05.24