Exception
- 예상하지 못한 에러를 의미
- 에러처리를 잘해두면 안정성과 유지보수성을 높일수 있다.
- 예상이 가능한 Error 인지 예상할 수 없는 Exception 인지 구분
- Error: 예상할 수 있는 애플리케이션 내부에서 발생할 수 있는 error case
- Exception: 예상할 수 없는 상태
Error(Exception) Handling
1. try-catch-finally
try
- 에러가 발생할 수 있는 정확한 구간에서 try를 이용해 감싸준다.
- try 블록에 모든 코드를 넣어 더럽히기 보다는 에러가 발생할수 있는 부분만 감싸는 것이 포인트
catch
- 에러가 발생하면 catch 블록으로 이동하여 동작
- 인자로 error 객체를 받는다.
- try문의 에러를 잡았으므로 코드 동작이 죽지 않는다.
fianlly
try-catch
절에서 항상 무조건 호출되는 블록
- try 코드와 연관되있거나 마무리 해야 하는 코드들을 finally에 작성
- finally 생략시 catch문에서 return 되거나 다른 에러가 발생할 경우 다음 로직이 실행되지 않는다.
2. 우아한 핸들링
- 에러가 발생했을 때 내가 정확하게 처리할 수 있는 것이 아니라면 catch 하지 않는 것이 좋다.
- try-catch 핸들링을 할 때 의미 있는 처리를 하는 곳을 찾아 그곳에서 catch를 한다.
3. Error State
- TypeScript에서 구현된 catch는 어떠한 타입정보도 전달되지 않아 instanceOf 키워드를 사용하여 에러를 구분할 수 없다.
- 코드를 작성할 때 예상할 수 있는 state(성공/실패)를 타입으로 정의해서 사용하면 예측가능하고 깔끔한 코드를 작성할 수 있다.
- 예상할 수 있는 모든 에러 케이스에 대해 따로 Error State를 만들어 두면 try-catch를 사용할 필요 없다.
type NetworkErrorState = {
result: 'fali';
reason: 'offline' | 'down' | 'timeout';
}
type SuccessState = {
result: 'success';
}
type ResultState = SuccessState | NetworkErrorState;
class NetworkClient {
tryConnect(): ResultState {}
}