티스토리 뷰

줍줍/코딩하다 안거

오류와 예외

일상다반ㅅㅏ 2019. 5. 15. 11:58

오류(error)
: 시스템에 비정상적인 상황이 생겼을 때 발생한다. 이는 시스템 레벨에서 발생하기 때문에 심각한 수준의 오류이다. 따리사 개발자가 미리 예측하여 처리할 수 없기 때문에 어플리케이션에서 오류에 대한 처리를 신경 쓰지 않아도 된다.

예외(exception)
: 개발자가 구현한 로직에서 발생한다. 즉, 예외는 발생할 상황을 미리 예측하여 처리할 수 있다. 예외는 개발자가 처리할 수 있기 때문에 예외를 구분하고 그에 따른 처리 방법을 명확히 알고 적용하는 것이 중요하다.

-- 예외클래스 구조 그림

checked/unchecked exception

  checked excepiton unchecked exception
처리여부 반드시 예외를 처리해야 함 명시적인 처리를 하지 않아도 됨
확인시점 컴파일 단계 실행 단계
예외발생 시 트랜잭션 처리 롤백 하지 않음 롤백 함
대표 예외

exception을 상속받는 하위 클래스 중 Runtime Exception를 제외한 모든 예외

- IOException

- SQLException

Runtime Exception 하위 예외

- NullPointerException

- IllegalArgumentException

- IndexOutOfBoundException

- SystemException


checked exception과 unchecked exception의 가장 명확한 구분 기준은 반드시 처리를 해야하는지이다.
checked exception이 발생할 가능성이 있는 메소드라면 반드시 로직을 try/catch로 감싸거나 throw로 던져서 처리해야 한다. 반면에 unchecked exception은 명시적인 예외처리를 하지 않아도 된다. 이 예외는 피할 수 있지만 개발자가 부주의해서 발생하는 경우가 대부분이고, 미리 예측하지 못했던 상황에서 발행하는 예외가 아니기 때문에 굳이 로직으로 처리를 할 필요가 없도록 만들어져 있다.
예외를 확인할 수 있는 시점에서도 구분할 수 있다. 일반적으로 컴파일 단계에서 명확하게 exception 체크가 가능한 것을 checked exception이라 하며, 실행 과정 중 특정 논리에 의해 발견되는 exception을 unchecked exception이라한다.

 

예외처리 방법

1) 호출자에게 보고하지 않고 처리하는 방법

public void Test() {
	try {
		// 소스가 실행되는 곳
	} catch (Throwable e) {
		// 예외가 발생 시 조치를 취하는 곳
	}
}

Test();

 

2) 호출자에게 바로 보고하는 방법
- 중요한 오류는 처리하지 말고 호출자에게 넘긴다.

public void Test() throws Throwable {

}

// 호출하는 메서드가 오류를 던진다고 선언되어 있으면 반드시 try...catch 문을 사용해서 호출해야 한다.
try{
	Test(); // 예외가 발생 시 즉시 호출자에게 보고한다.
} catch (Throwable e) {
	// 예외 처리하는 곳. 중요한 예외는 호출자가 처리한다.
}

 

3) 선 조치 후 보고 방법
- 중요한 예외 발생 시 보고하기 전에 먼저 오류 처리하고 보고 함.

public void Test() throws Throwable {
	try {
	
	} catch (Throwable e) {
		// 일단 오류 처리하고..
		
		// 호출자에게 오류 내용 보고함
		throw new Throwable("요류내용...");
	}
}

try {
	Test(); // 치명적인 오류 발생 시 내부적으로 처리한 후 보고한다.
} catch(Throwable e) {
	// 예외에 대한 추가 조치를 한다.
}

 

참고)

https://gocoding.tistory.com/146
http://www.nextree.co.kr/p3239/

'줍줍 > 코딩하다 안거' 카테고리의 다른 글

mySQL LAST_INSERT_ID()  (0) 2019.06.17
logback 설정 에러  (0) 2019.06.06
로깅 설정  (0) 2019.05.21
클래스 멤버와 인스턴스 멤버  (0) 2018.12.30
Date와 Timestamp 차이  (0) 2018.12.09