Exception
예외 종류
Error
- java.lang.Error 클래스의 서브 클래스이다. 에러는 시스템에 뭔가 비정상적인 상황이 발생했을때 사용된다.
체크 예외와 언체크 예외
Exception
java.lang.Exception 클래스와 그 서브 클래스로 정의되는 예외들은 에러와 달리 개발자가 작업중에 코드에 예외상황이 발생했을때 사용된다.
- 체크예외
- 컴파일에러
- 복구불가능한 에러
- RuntimeException만 상속받지않은 예외
RuntimeException
java.lang.RuntimeException 클래스를 상속한 예외들은 명시적인 예외처리를 강제하기 때문에 언체크 예외라고 불린다.
- 런타임 예외
- 개발자가 부주의해서 발생할 수 있는 경우에 발생하도록 만든 예외
- catch나 throws를 사용하지 않아도 된다.
예외 처리 방법
예외 복구
try~catch/finally 를통해서 예외상황이 돌아오고 사용자에게 메세지를 보여주거나하는 것을 예외 복구라고 할수있다.
try{
// 예외가 발생할수 있는 코드 시도
//성공
}cathch(Excpetion e){
//로그 및 오류 코드 실행
}finally{
//정리작업
}
throw new ...Exception(); // 자신이 생각한 예외 발생
예외처리 회피
throws 문으로 선언해서 예외가 발생하면 알아서 던지게 하거나 catch 문으로 예외를 잡은 후에 로그를 남기고 다시 예외를 던지는 방법이다.
(무분별한 회피로 인해 서버까지 예외가 전달된다.)
public void method()throws Exception {
try{
//코드실행
}catch(Exception e){
throw e;
}
}
예외 전환
예외 회피와 비슷하지만 예외 회피와는 달리 적절한 예외로 변환해 예외를 던지는 것이다.
보통 두가지 목적으로 사용된다.
첫번째, 내부에서 발생한 예외를 그대로 던지는 것이 그 예외 상황에 대한 적절한 의미를 부여 해주지 못하는 경우에, 분명한 의미로 변경해주는 것
만약 회원 가입시 아이디가 중복되었을때 중복되었다는 예외가 발생한다고 가정해보자
public class DuplicateUserIdException extends RuntimeException{
public DuplicateUserIdException(Throwable throwable){
super(throwable);
}
}
런타임 예외로 상속받아 Duplicate... 예외를 만든다
public void add(User user) throws DuplicateUserIdException,Exception {
try {
//실행 코드
}catch (Exception e){
if(예외 조건){
throw DuplicateUserIdException();
}else throw e;
}
}
코드처럼 예외 조건이 발생할때에 만들었던 예외를 통해서 발생시키고 그렇지 않으면 일반 예외를 던지게 하는것이다.
두번째, 예외를 초리하기 위 쉽고 단순하게 만들기 위해 포장 하는것
결론
그렇다면 예외를 처리할때 예외를 만들어 처리하는 것이 좋을까?
그것은 체크예외보다 런타임 예외를 더 사용하는것이 좋은 방법이다 그 이유는 다음과 같다.
- 처리의 강제성 : 체크 예외는 throws를 통해서 강제로 예외를 던저야 하는데 이런 방식은 불편하며, 예외가 발생할 가능성이 낮아서 강제적으로 선언해줘여한다.
- 개발자 실수 : 런타임 예외는 개발자 실수로 인해 나타나는 예외이다. 그러므로 컴파일러가 체크하지 않아도 되기 때문에 코드작성에 좀더 유연한 코드 작성이 가능하다
- 유연성과 간결성 : 런타임 예외는 체크예외와 달리 강제성이 없는 코드 이기 때문에 간결한 코드로 만들수있다
- 가독성 : 체크 예외를 사용하면 특정한 상황에 예외발생이 명확하지 않기때문에 가독성이 떨어지지만 런타임 예외는 명확한 예외선언으로 코드의 가독성이 한결 높아진다
'Spring > spring' 카테고리의 다른 글
[스프링] AOP(Aspect-Oriented-Programming)이해 (0) | 2023.11.22 |
---|---|
[스프링] 트랜잭션(Transaction)이란 (0) | 2023.11.22 |
스프링 서비스 추상화 (1) | 2023.11.19 |
스프링 오브젝트 와 의존관계 (1) | 2023.11.14 |
스프링이란? (0) | 2023.05.28 |