1) Checked Exception
2) Unchecked Exception
class FoolException extends Exception {
}
public class Sample {
public void sayNick(String nick) {
**try** {
if("fool".equals(nick)) {
**throw new FoolException();**
}
System.out.println("당신의 별명은 "+nick+" 입니다.");
} **catch(FoolException e)** {
System.err.println("FoolException이 발생했습니다.");
}
}
public static void main(String[] args) {
Sample sample = new Sample();
sample.sayNick("fool");
sample.sayNick("genious");
}
}
public class Sample {
public void sayNick(String nick) **throws FoolException** {
if("fool".equals(nick)) {
**throw new FoolException();**
}
System.out.println("당신의 별명은 "+nick+" 입니다.");
}
public static void main(String[] args) {
Sample sample = new Sample();
**try** {
sample.sayNick("fool");
sample.sayNick("genious");
}** catch (FoolException e) **{
System.err.println("FoolException이 발생했습니다.");
}
}
}
=> 프로그램에서 Exception을 처리하는 위치는 중요하다. 프로그램의 수행여부를 결정하기도 하고 트랜잭션 처리와도 밀접한 관계가 있기 때문
catch(SQLException e) {
...
throw DuplicateUserIdException();
}
예외를 잡고 아무런 처리도 하지 않는 것은 정말 위험하다.
try-catch로 예외를 잡아놓고 catch를 비워두면 컴파일 오류는 나지 않지만, 예외가 발생했을 때 그 원인을 파악하기 어려워 개발 및 유지보수에 좋지 않은 영향을 끼친다
-> 어떤 처리를 해야 하는지 모르더라도 무작정 catch하고 무시하거나 throw해버리는 행위는 신중해야 한다.
메소드를 정의할 때 메소드에서 발생할 수 있는 예외를 최대한 자세하게 명시하는 것이 좋다.
Exception 클래스로 퉁쳐버리면 이 메소드를 호출하는 쪽에서 예외처리하는 코드가 복잡해진다. Exception으로 받은 예외가 NumberFormatException인 경우도 있고, IlegalArugmentException, IOException 등 일 수도 있다. 따라서 모든 경우에 대한 코드를 작성할 수 밖에 없다.
상품발송() {
포장();
영수증발행();
발송();
}
포장() {}
영수증발행() {}
발송() {}
-> 쇼핑몰의 운영자는 이 3가지 일들 중 하나라도 실패하면 3가지 모두 취소(롤백)하고 "상품발송" 전의 상태로 되돌리고 싶을 것이다 -> 예외처리 어떻게?
상품발송() {
try {
포장();
영수증발행();
발송();
}catch(예외) {
모두취소(); // 하나라도 실패하면 모두 취소한다.
}
}
포장() throws 예외 {}
영수증발행() throws 예외 {}
발송() throws 예외 {}
이렇게 포장/영수증발행/발송 메서드에서는 예외를 throws하고(넘기고) 상품발송 메서드에서 throws된 예외들을 처리하여 모두 취소하는 것이 완벽한 트랜잭션 처리 방법
(포장, 영수증발행, 발송이라는 세개의 단위작업 중 하나라도 실패할 경우 "예외"가 발생되어 상품발송이 모두 취소 될 것)
https://wikidocs.net/229
https://www.nextree.co.kr/p3239/
https://hbase.tistory.com/157