try {
//예외발생할 가능성이 있는 문장
}catch(Exception1 e1) {
//Exception1이 발생했을 경우, 이를 처리하지 위한 문장적는다.
//보통 이곳에 예외메세지를 출력하고 로그로 남김.
}catch(Exception2 e2) {
//Exception2이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
}catch(ExceptionN eN) {
//ExceptionN이 발생했을 경우, 이를 처리하기 위한 문장을 적는다.
}finally{
//예외발생 여부에 관계없이 항상 수행되어야 하는 문장을 적는다.
}
📌finally 블록은 대체로 어떨 때 사용하는가?
- 보통은 자원이나 DB에 커넥션 한 경우, 파일 닫기, 연결 닫기(close) 등과 같은 "정리"코드를 넣는 데 사용된다.
<예외가 try 블럭에서 발생한 경우>
<예외가 try 블럭 안에서 발생하지 않은 경우>
<예외가 try 블럭 밖에서 발생한 경우>
📌tip!
- Try-catch 블럭에서 예외 발생시, 예외가 발생한 위치 이후에 있는 try블럭의 문장들은 수행되지 않으므로, try블럭에 포함시킬 코드의 범위를 잘 선택해야한다.
괄호()와 블럭{} 두부분으로 나눠져있는데, 괄호에는 처리하고자하는 예외타입(Exception), 참조변수(e)를 선언한다.
예외발생시 발생예외에 해당하는 클래스의 인스턴스가 만들어진다.
catch (AuthException e) {
e.printStackTrace(); //예외정보 출력
log.error("AuthException ERROR: {} ", e.getMassage()); //로그남김
throw e; //예외 던지기
} catch (Exception e ) {
e.printStackTrace();
log.error("Exception ERROR: {} ", e.getMassage());
throw e;
}
📌 printStackTrace()
- 예외발생당시의 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메세지를 콘솔화면에 출력한다.
- getMessage 와는 다르게 printStackTrace는 리턴값이 없다.
- 이 메소드를 호출하면 메소드가 내부적으로 예외 결과를 화면에 출력한다.
- printStackTrace는 가장 자세한 예외 정보를 제공한다
실행결과ex)
java.lang.AuthException:
at org.opentutorials.javatutorials.exception.Calculator.divide(CalculatorDemo.java:11)
at org.opentutorials.javatutorials.exception.CalculatorDemo.main(CalculatorDemo.java:25)
.
.
📌 getMessage()
- 발생한 예외클래스의 인스턴스에 저장된 메세지를 얻을 수 있다.
- 오류에 대한 기본적인 내용을 알수 있지만 상세하지 않다.
public static void main (String[] args) {
try {
Exception e = new Exception("고의발생"); // 1. 예외 생성
throw e; // 2. 예외 던지기
} catch (Exception e) {
System.out.println("에러메세지:" + e.getMessage());
e.printStackTrace(); //예외정보 출력
}
System.out.println("프로그램 정상 종료.");
}
실행결과
에러메세지: 고의발생
java.lang.Exception: 고의발생
at ExceptionEx9.main(ExceptionEx9.java:4)
프로그램 정상 종료.