1. 정의
개발하며 발생하는 오류를 아무조취를 취하지 않거나 콘솔에 찍는것은 좋은 방법이 아님. 따라서 모든 예외는 적절하게 복구되던지, 작업을 중단시키고 운영자 또는 개발자에게 분명하게 통보가 되어야함.
2. 예외의 종류
Error
java.lang.Error 클래스의 서브 클래스로 시스템에 비정상적인 상황이 발생했을때 사용된다. 주로 VM에서 발생시키는것으로 코드상에서 에러를 찾으려고 하면 안된다.
Exception과 체크 예외
java.lang.Exception
java.lang.Exception 클래스와 그 서브클래스로 정의되는 예외는 개발자가 만든 애플리케이션 코드 작업중에 예외상황이 발생하였을 경우에 사용한다. 이 중 체크예외는 RuntimeException 클래스를 상속하지 않은 부분을 의미한다.
RuntimeException과 언체크 예외
java.lang.RuntimeException 클래스를 상속한 예외들을 의미하고, 명시적인 예외처리를 강제하지 않기 때문에 언체크 예외라고 불린다. 에러와 마찬가지로 catch나 throws로 잡아주지 않아도 된다. 주로 프로그램의 오류가 있을때 발생한다.
3. 예외처리 방법
예외 복구
사용자가 요청한 파일을 읽으려 했으나 파일이 없거나, 읽히지 않아서 IOException이 발생한 경우, 사용자에게 상황을 알려주고 다른 파일을 이용하도록 하는 과정, 이 때 사용자에게 예외상황을 안내만하는경우는 복구라고 할 수 없다.
이는 네트워크 오류로인해 sql이 실패할경우 대기시간을 거쳐 여러번 시도하게하는 예시이다.
int maxretry = MAX_RETRY;
while(maxretry --> 0){
try{
..
}
catch(SomeException e){
//로그 출력 정해진 시간만큼 대기
}
finally {
//리소스반납 정리작업
}
}
throw new RetryFailedException();
예외처리 회피
throw문으로 선언하여 예외가 발생하면 알아서 던져지게 하거나, catch문으로 예외를 잡고 로그를 남기고 다시 예외를 던지는 방법을 의미한다. 이때 내가 처리하지않고 회피한다는것이 catch로 예외를잡고 예외를 발생하지 않은것처럼 하는것은 아니다.
이는 JDBC Template에 에러를 넘기는 예시이다. 하지만 콜백이나 템플릿이 아닌 자신의 코드에서 발생하는 예외를 던지는것은 회피가 아니다.
public void add() throws SQLException {
//JDBC API
}
public void add() throws SQLException {
try{
//JDBC API
}
catch(SQLException e){
throw e;
}
}
예외 전환
예외 회피와 비슷하게 예외를 복구해서 정상적인 상태로 만들 수 없기 때문에 예외를 메소드 밖으로 던지는 것 이다. 하지만 예외 회피와 달리 예외를 분명하게 의미있는 예외로 바꾸어 전달하는것을 의미한다.
예를들어 새로운 사용자를 등록하려 했을때 DB에 중복되는 아이디가 있다면 JDBC API는 SQLException을 발생시킨다 이를 DuplicateUserIdException으로 바꾸어 던지는것을 의미한다.
public void add(User user) throws DuplicateUserIdException, SQLException {
try{
//JDBC를 이용해 user 정보를 DB에 추가하는 코드
}
catch(SQLException e){
//ErrorCode가 Mysql의 "Duplicate Entry(1062)" 이면 예외 전환
if(e.getErrorCode() == MysqlErrorNumbers.ER_DUP_ENTRY)
throw DuplicateUserIdException();
else
throw e;
}
}
'프로그래밍 > 시큐어코딩' 카테고리의 다른 글
[스프링 이해와 원리] 전략패턴 이란? 순서2 (0) | 2020.07.08 |
---|---|
[스프링 이해와 원리] IOC와 DI 및 패턴 (순서 1) (0) | 2020.07.08 |
[스프링 이해와 원리] #4. 스프링 의존성 주입 (0) | 2020.07.07 |
[스프링 이해와 원리] #3. 싱글톤 레지스트리와 오브젝트 스코프 순서3 (0) | 2020.07.07 |
[스프링 이해와 원리] #2. 스프링 Bean의 생성과 관리 (0) | 2020.07.07 |