try-catch-finally - catch 문은 여러개 가능, finally는 생략 가능, 부모 예외 클래스보다 자식 클래스가 먼저 나올 수 없음
try {
}
catch{
}
catch{
}
finally{ //예외 발생 여부와 상관없이 항상 실행되는 코드
}
Exception 클래스 - 최상위 클래스로 모든 예외를 잡음
printStackTrace() - 현재 발생한 예외의 호출 스택을 보여줌
getMessage() - 예외가 왜 발생했는지에 대한 내용, 메시지가 없을 때는 null 반환
rethrow - 예외가 발생했을 때 상위로 예외 처리를 넘기는 방식, 호출 스택이 없어질 수 있기 때문에 주의
checked 예외 - Java에만 존재, Exception 상속, IOException, SQLException, TimeoutException..., 컴파일러가 예외 처리 하는지 확인함, 어느 메서드가 어떤 예외를 처리하는지 확인 가능, 예외가 발생하는 코드에서 발생한 예외를 그 메서드 안에서 처리하지 않거나(catch) 처리를 하지 않을 경우에 그 사실을 메서드 시그니처 옆에 표시하지 않으면 컴파일 오류(메서드 선언 throws 예외 클래스 이름)
unchecked 예외 - C# 예외와 동일, RuntimeException 상속, 컴파일러가 따로 검사 X
제어 흐름용으로 예외 사용 금지, goto와 같아짐
오류 상황 - 예측이 가능한 상황을 의미
오류 상황을 처리하는 4가지 방법 (수정 > 종료 > 예외 > 무시)
- 무시하고 넘어감 (무시) : 곧바로 크래시, 언젠가 크래시, 불안정한 상태로 동작
- 문제를 일으킬 수 있는 상황이 있는지 검사하고, 프로그램 종료 (종료) : 어떤 문제가 있는지 보여주고 종료, 팝업, 로그 파일
- 문제를 일으킬 수 있는 상황이 있는지 검사하고, 실수를 고친 뒤 계속 프로그램 실행 (수정)
- 문제가 발생하면 예외 적용 (예외)
예외는 OO의 일부가 아님(생성자가 없을 때는 알기 힘듬), 잘못된 예외처리보다 크래시가 나음(크래시 해결법 - 자동 세이브, 덤프 확인 가능), 프로그램 종료도 좋은 방법(이상 상태가 되는 것 방지)