7장 오류 처리
깨끗한 오류 처리 코드를 작성하는 방법을 소개하는 장. 오류 처리를 프로그램 논리와 분리하면 독립적인 추론이 가능하므로 코드 유지보수성이 높아진다.(아래의 순서는 내가 이해하기 쉽도록 임의로 섞어서 그룹핑 해 둔 것이다.)
1. 오류보다 예외 처리
- 오류 코드보다 예외 처리를 사용하라
- 예외가 발생할 코드에서는 try-catch-finally문을 먼저 작성하라: try문에서 강제로 예외를 일으키는 테스트 케이스 작성 후 catch문을 테스트하고 난 다음, try문에는 절대 예외가 발생하지 않는다고 가정하고 코드를 작성할 수 있다.
- 예외에 의미를 제공하라. 예외에 오류 메시지 객체(연산 이름+실패 유형)를 첨부하고, catch문에서 로깅 기능으로 오류를 기록하라
2. 예외 처리 기법
- 메서드에서 null을 반환하거나 인수로 전달하지 마라. 대신 예외를 던지거나 특수 사례 객체를 반환한다. 외부 API가 null을 반환하는 상황에는 감싸기 메서드를 구현한다.
- unchecked 예외(실행 단계에서 확인이 어려운 오류, 런타임 에러나 프로그래밍 오류 같은 것)는 시스템의 몫으로 남겨두라
- 외부 라이브러리 호출시 단일 예외 처리 사용
- 감싸기 기법
// 외부 API를 호출하는 클래스
class ExternalAPI {
constructor() {}
open() {
// 외부 API 호출
}
}
// 단일 에러 처리 객체
class ExternalAPIError extends Error {
constructor(message) {
super(message);
this.name = 'External API Call Error';
}
}
// 래퍼 클래스
class Wrapper {
constructor() {
this.externalAPI = new ExternalAPI();
}
open() {
try {
this.externalAPI.open();
} catch (error) {
throw new ExternalAPIError(error.message);
}
}
}
const apiWrapper = new Wrapper();
try {
apiWrapper.open();
} catch (error) {
reportError(error);
logger.log(error.message, error);
} finally {
// Clean-up code
}
- 예외 처리를 특수 사례 패턴으로 구현하라
- 특수 사례 패턴: 예외적인 상황을 새로운 클래스나 객체로 캡슐화해서 처리
class BaseCase {
calculate() {}
}
class ExtraCase extends BaseCase {
calculate() {
// (특수 사례)
}
}
// 예외 처리를 특수 사례로 구현
function calculateResult() {
let result;
try {
result = obj.getResult();
} catch (error) {
result = new ExtraCase();
}
return result.calculate();
}
const result = calculateResult();
댓글