개발자 99% 커뮤니티에서 수다 떨어요!
오늘 TIL 3줄 요약
오류 처리로 인해 파악하기 힘든 코드들이 생긴다.
오류를 처리하면서도 코드를 파악하기 좋은 방법들이 있다.
깨끗한 코드는 읽기 좋으며 안정성도 높은 코드이다.
TIL (Today I Learned) 날짜
2022.05.06
오늘 읽은 범위
7장 오류 처리
책에서 기억하고 싶은 내용을 써보세요.
오류 코드보다 예외를 사용하자
오류가 발생했을 때 오류 코드로 로그를 찍는 것 보다 try-catch 문으로 감싸서 예외를 던지는 것이 오류를 확인하고 코드를 읽기 더 편해진다.
알고리즘와 오류를 처리하는 부분을 분리하자.
public void sendShutDown() {
try {
tryToShutDown();
} catch (DeviceShutDownError e) {
logger.log(e);
}
}
private void tryToShutDown() throws DeviceShutDownError {
...
}
오류를 잡아내는 방법에 집중하자
외부 라이브러리가 던지는 모든 예외를 try-catch 문으로 잡게 되면 예외의 형식과 무관하게 거의 동일하게 처리하게 되고 중복이 많아진다.
ACMEPort port = new ACMEPort(12);
try{
port.open();
} catch (DeviceResponseException e) {
reportPortError(e);
logger.log("Device response exception", e);
} catch (ATM1212UnlockedException e) {
reportPortError(e);
logger.log("Unlock exception", e);
} catch (GMXError e) {
reportPortError(e);
logger.log("Device response exception", e);
} finally {
...
}
wrapper 클래스를 생성하여 외부 라이브러리와의 의존성을 줄이고 예외 유형을 정해서 더 깔끔하게 표현할 수 있다.
Local port = new LocalPort(12);
try{
port.open();
} catch (PortDeviceFailure e) {
...
} finally {
...
}
public class LocalPort {
private ACMEPort innerPort;
public LocalPort(int portNumber){
innerPort = new ACMEPort(portNumber);
}
public void open(){
try{
innerPort.open();
} catch (DeviceResponseException e){
throw new PortDeviceFailure(e);
} catch (... e){
throw new PortDeviceFailure(e);
} catch (... e){
throw new PortDeviceFailure(e);
}
}
}
null 을 반환하지 말자
null 을 반환하게 되면 null 을 확인하는 코드가 들어가게 되어 일을 늘리고 호출자에게 문제를 떠넘긴다.
null 을 인자로 전달하지 마라
null 을 인자로 전달하게 되면 NullPointerException
이 발생하지 않게 하려고 매번 인자를 검사해야한다.
assert
를 이용하여 해당 인자를 검증할 수도 있다.
오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요
비즈니스 로직과 오류 처리를 분리하기, wrapper 클래스를 만들어서 외부 라이브러리와 의존성 줄이기는 바로 적용해 볼 수 있을 것 같은 유용한 내용이었다.
다른 건 그래도 나름 신경쓰지만 예외처리 부분을 크게 신경쓰지 못하고 코드를 작성해왔던 것 같다.
예외 처리도 클린코드를 위한 중요한 부분인만큼 더 신경써서 코드를 작성해봐야겠다.