# 예외

## 예외 정리

### 종류

| 구분                  | 예                                                                                                 | 롤백여부 |       처리 여부      |
| ------------------- | ------------------------------------------------------------------------------------------------- | :--: | :--------------: |
| Checked Exception   | <ul><li>Exception</li><li>IOException</li><li><p>SQLException</p><p>.....</p></li></ul>           |   O  | try\~catch반드시 처리 |
| Unchecked Exception | <ul><li>NPE</li><li>NumberFormatException</li><li><p>Illegal\~Exception</p><p>.....</p></li></ul> |   X  |         X        |

### 추세 및 권고 사항

* **Unchecked Exception을 사용**
* 검사 예외에서 따로 처리하는게 없음. 대부분 로깅하고 끝.
  * 검사예외에서는 유의미한 어떤 작업이 필요하나 보통 하지 않음
  * 소스코드를 복잡하게 만드는 원흉이됨
  * 예전에는 검사예외가 권고사항이었으나, 타 언어에서도 그렇고 검사예외는 이제 정말 필요할 때 아니면 사용을 금함
  * **비검사 예외를 적극 사용하고, 유의미한 예외처리 필요**

### 레이어에 맞는 예외처리

* 웹기반에서 흔히 **Controller 레이어, Servcie 레이어, DAO 레이어** 등 **각 레이어 성격에 맞는 예외처리.**
  * Service 레이어에서 SQLException 처리를 한다던지 등은 성격에 맞지 않음

### 로그 프레임워크

* **Logback, log4j 등 로그 프레임워크 사용하여 로그 관리**

### **처리 방식**

* 상위가 아래

```java
try{
  // ....
} catch(IOException e){
  // work
} catch (Exception e){
  // work
}
```

* **try\~catch** 에서 **반드시 어떤 작업이라도 할것**
  * 로그를 남겨야한다면, **로그 프레임워크를 통해 로그를 남길것**

```java
try{
} catch(Exception e){
  log.error("error~~", e);
}
```

* 예외전환
  * 좀더 명확한 예외로 던지기

```java
try{
} catch(Exception e){
  throw new BizException(e);
}
```

* 상위 예외 처리 회피는 세부 Exception을 가리게 됨 → 사용하지 말 것

```java
public void test throws Exception {
	// ...
}
```
