참고: http://www.tcpschool.com/java/java_exception_intro
Exception 클래스
- 오류 (error) : 시스템 레벨에서 발생하는 심각한 수준의 오류로, 실행 중인 프로그램을 종료 시킴 > 미리 예측 불가능, 처리가 불가능
- 예외 (exception) : 개발자가 구현한 로직에서 발생하는 문제, 발생 상황을 미리 예측해서 예방할 수 있다. > 처리 가능
모든 예외 클래스는 Throwable 클래스를 상속받는다.
Throwable을 상속받는 클래스
- Error
- Exception
Exception 클래스
자바에서 발생하는 모든 예외의 조상 클래스
- RuntimeException와 그 하위 클래스들 = UncheckedException 클래스
- 그 외 Exception의 자식 클래스 = CheckedException
Checked Exception vs Unchecked Exception 차이 // 중요
Checked Exception Unchecked Exception
확인 시점 | 컴파일 단계 | 실행 단계 |
예외 발생 시 트랜잭션 처리 | roll back 하지 않음 | roll back 한다 |
처리 필수 여부 | 반드시 예외 처리해줘야 함 | 예외 처리를 강제하지 않음 |
Checked Exception
Checked Exception은 애플리케이션이 실행되기 위해서 반드시 예외 처리 해줘야 한다.
컴파일 단계에서 확인하기 때문에, 예외 처리하지 않으면 프로그램이 실행되지 않는다.
- IOException
- SqlException
public class CheckedException {
public static void main(String[] args)
{
try
{
// Exception 클래스로 예외를 실행시킨다.
throw new Exception();
} catch (Exception e)
{
// Checked Exception 이므로 예외처리를 해주는데 해주지 않으면 컴파일 실패
System.out.println("Exception");
}
}
}
Unchecked Exception
RuntimeException은 실행 단계에서 발행할 수 있는 모든 예외를 의미한다. 애플리케이션이 컴파일을 통과하고 실행은 된다.
- NullPointerException
- IllegalArgumentException
- IndexOutOfBoundException
- SystemException
public class ExceptionEx1 {
public static void main(String[] args)
{
// 에러가 발생하지만 컴파일은 가능하다.
throw new RuntimeException();
}
}
예외 처리 방법
try-catch 블록
try 블록 안에 예외가 발생할 수 있는 코드를 작성하고, catch 블록에서 try에서 예외가 발생하면 catch 블록에서 처리한다.
- 예외 타입에 따라 catch 블록을 여러 개 작성 가능 > 발생한 예외와 일치하는 catch 블록이 실행된다
- (옵션) catch 블록
- (옵션) finally 블록: 예외 발생 여부와 상관없이 항상 실행
try {
// 예외가 발생할 수 있는 코드
} catch (예외 타입1 e) {
// 예외 처리 코드
} catch (예외 타입2 e) {
// 예외 처리 코드
} finally {
// 항상 실행되는 코드 (optional)
}
가능한 케이스
- try / catch
- try / finally
- try / catch / ... / finally
JAVA SE 7부터 ‘|’ 기호를 사용해 하나의 catch 블록에서 여러 타입 예외를 동시에 처리할 수 있다.
- 단, 여러 예외를 동시에 처리하는 catch 블록의 매개변수로 전달받은 예외 객체는 묵시적으로 final 제어자를 가지게 된다. > catch 블록 내에서 해당 매개변수에 값을 대입할 수 없다.
try {
// 실행 코드
} catch (IOException e) {
// 에외 처리 코드
} catch (SQLException e) {
// 예외 처리 코드
}
// | 기호로 동시 처리
try {
// 실행 코드
} catch (IOException | SQLException e) {
// 에외 처리 코드
}
throws
메서드 선언부에서 throws 키워드로 해당 메소드에서 발생할 수 있는 예외를 명시
- 메소드 동작 중에 예외 발생 > 메서드를 호출한 곳으로 예외를 던진다.
- 메소드를 호출한 곳에서 예외를 처리하도록 할 수 있다.
public class ExceptionEx {
static void handlingException() throws Exception {
throw new Exception(); // 강제로 예외를 발생 시킴
} // Exception 예외(모든 예외를 의미)를 호출한 곳으로 던짐
public static void main(String[] args) {
try {
handlingException();
} catch (Exception e) {
System.out.println("main() 메소드에서 예외 처리");
}
}
}
// 결과
main() 메소드에서 예외 처리
사용자 정의 예외 처리 // 주로 사용하는 방법
Exception 클래스를 상속받아 사용자 정의 예외 클래스 정의한다. 원하는 상황(코드)에서 정의한 예외를 발생시켜 사용할 수 있다.
public class MyException extends Exception{
public MyException(String message) {
super(message);
}
public static void throwException() throws MyException{
throw new MyException("사용자 정의 예외 발생");
}
public static void main(String[] args) {
try {
throwException();
} catch (MyException e) {
System.out.println(e.getMessage());
}
}
}
cf) 예외 처리 방법
- 예외 복구
- 예외가 발생 > 재시도를 통해 예외를 복구한다. 최대 재시도 횟수를 넘기면 예외를 발생시킨다.
- 예외가 발생해도 애플리케이션은 정상적인 흐름으로 진행된다.
- 예외 처리 회피
- 예외가 발생 > throws 사용해 호출한 쪽으로 예외를 던지고 처리를 회피하는 것
- 예외 전환
- 예외를 잡아서 다른 예외를 던지는 방법
- 호출한 쪽에서 좀 더 명확한 예외를 인지해서 처리하도록 도울 수 있다.
'CS > Backend' 카테고리의 다른 글
[Spring] 웹 애플리케이션 개념 정리 (0) | 2023.06.22 |
---|---|
[이슈] Spring boot 프로젝트 실행 시 html 파일을 찾지 못하는 에러, whitelabel error page (0) | 2023.06.13 |
[MySQL] WINDOW 함수 (0) | 2023.05.26 |
[MySQL] JOIN (0) | 2023.05.26 |
[Java] Generic, 제네릭 (0) | 2023.05.26 |