들어가기
자료를 찾기 이전에 제가 알고 있던 예외처리는 그저 try-catch 정도였습니다. 다중 예외처리를 구현할때는 예외 계층에 대해서 주의해야하구요. 사실 저는 그냥 throws Exception 위주로 사용하고 있었습니다. 이번 기회에 모르는 부분이 있다면 보충해보고 잘못 알고 있는 부분은 정정해보겠습니다.
예외란?
예외가 무엇일까요? 에러의 경우에는 오동작 혹은 고장으로 인해서 프로그램이 종료되는 상황입니다. 이런 상황은 애초에 발생하지 않도록 주의해야합니다. 예외는 사용자의 잘못된 조작으로 인해서 발생할 수 있습니다. 원래라면 예외도 프로그램이 종료가 되지만 프로그래머가 예외처리를 통해서 정상적으로 작동하게끔 만들 수 있습니다.
에러와 예외의 차이점 한 줄 요약 -> 예외는 에러와 달리 핸들링이 가능하다
예외처리 방법
try-catch 구문
try {
// 예외가 발생할 가능성이 있는 코드
} catch (Exception1 e1) {
// Exception1이 발생했을 때, 이를 처리하기 위한 코드
} catch (Exception2 e2) {
// Exception2가 발생했을 때, 이를 처리하기 위한 코드
}
주석에 관련 내용을 적어뒀지만 음.. 아무래도 안에 살을 채워넣는 편이 이해하기 더 쉬우려나요??
@PostMapping("/user/register")
public String signup(UserDto userDto,HttpServletRequest request,HttpServletResponse response){
userService.saveUser(userDto,request,response);
try{
request.login(userDto.getUsername(),userDto.getPassword());
}catch(ServletException e){
System.out.println(e.getMessage());
}
return "redirect:/board/list";
}
어제 다뤘던 회원가입 후 자동로그인 예제를 try-catch문으로 표현하면 이렇습니다. 실무에서는 어떨지 모르지만 일반 토이 프로젝트에서는 에러가 발생한다면(catch문을) 로그를 찍는 방식으로 사용합니다.
참고로 catch문이 여러개면 그중에서 알맞는거 하나만 실행된답니다. 그렇다보니까 주의해주셔야 될 점이 있습니다. 상위 예외클래스는 하위 예외 클래스보다 아래쪽에서 처리해주어야 합니다. 당연하게도 위에서부터 아래로 검사를 할텐데, 상위 예외 클래스면 그 쪽에서 다 잡아먹어 버리잖아요?? 그래서 그걸 아래쪽에다가 배치해줘야합니다.
저는 이걸보고 if - else if 문처럼 느껴졌습니다.
또한, 이건 필수는 아닌데요. try-catch-finally 구문이 있습니다. finally 자체가 선택사항인건데 여기에는 예외가 발생하거나 말거나 언제나 실행되어야 될 구문들이 들어갑니다.
throw 구문
메서드 내에서 throw new 예외; 의 형태로 사용합니다. 의도적으로 예외를 발생시켜서 던져버리는 방식입니다.
정확히는 Exception e = new Exception("hello"); throw e; -> throw new Exception("hello");로 축약됩니다.
throws
throws는 메서드에 붙여주는 키워드입니다.
@PostMapping("/user/register")
public String signup(UserDto userDto,HttpServletRequest request,HttpServletResponse response) throws ServletException {
userService.saveUser(userDto,request,response);
request.login(userDto.getUsername(),userDto.getPassword());
return "redirect:/board/list";
}
저는 몰랐는데 이렇게 메서드에 throws를 붙여준다고 해서 예외처리가 끝나는 것은 아니라고 합니다. 이걸 호출해서 사용하는 쪽에서 예외처리를 하라고 책임전가하는 키워드라고 합니다.
자바 예외 계층 구조
맨 위의 Throwable이 있고 그 아래 자식들이 있죠. 이 그림은 예외 계층 구조를 나타내고 있습니다. 빨간색 파트들은 Checked Exception이라고 부르고 파란색은 Unchecked Exception이라고 합니다. Runtime Exception을 제외하고는 모두 Checked Exception에 해당합니다.
Checked Exception
Checked Exception은 컴파일 시점에서 확인될 수 있는 예외입니다. 만약 코드 내에서 Checked Exception을 발생시킨다면, 해당 예외는 반드시 처리되어야 합니다.
Unchecked Exception(=Runtime Exception)
언체크드 예외에 런타임 뿐이니 둘을 같은 것으로 두고 설명하겠습니다. 컴파일 시점에서 확인할 수 없는 예외들을 일컫습니다. 컴파일러가 강제하지는 않으나 프로그래머가 자진해서 처리해야 된다고 합니다. 왜 얘네들은 강제하지 않는걸까요?? 이는 프로그램 어디서나 빈번하게 발생할 수 있기 때문이라고 합니다. 그런걸 매번 예외처리 해두라고 강제하면 프로그램의 명확성을 떨어트릴 가능성이 있으니 이 둘(checked, unchecked)을 구분했다고 합니다.
커스텀 예외 만들기
Exception 클래스를 상속받아서 직접 만들 수 있습니다.
public class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
public class ExceptionDemo {
public static void main(String[] args) throws MyException {
int n = -5;
if (n < 1) {
throw new MyException("음수 입니다");
}
}
}
참고
자바의 정석
'Java' 카테고리의 다른 글
[JAVA] Enum 열거형 정리 (0) | 2021.06.07 |
---|---|
[JAVA] 멀티쓰레드 프로그래밍 (0) | 2021.06.02 |
[Java] 인터페이스에 대하여 (0) | 2021.05.10 |
[JAVA] 패키지 (0) | 2021.05.03 |
객체지향 프로그래밍이란? (0) | 2021.04.30 |