[클린 코드: Clean Code] 7장 오류 처리

devssun 2019. 8. 14. 23:50
728x90
반응형

이곳은 7장입니다 다행히 오늘도 재밌게 스무스하게 읽었습니다

물론 중간에 어렵긴 했지만... 

안그래도 회사에서 API 호출하고 나서 처리를 if == result code , else, else 로 하고 있어서 얘를 좀 코드화 시켜서 정리할 순 없을까.. 생각이 들고 있었는데 마침 읽게 되었다

얼른 정리하기


7장 오류 처리

 

오류 처리는 프로그램에 반드시 필요한 요소 중 하나

뭔가 잘못되면 바로 잡을 책임은 프로그래머에게 있다

깨끗한 코드와 오류 처리는 확실히 연관성이 있다. 오류 처리는 중요하지만 오류 처리 코드로 인해 프로그램 논리를 이해하기 어려워 진다면 깨끗한 코드라 부르기 어렵다

그럼 깨끗한 코드로 다가가는 단계로 오류를 처리하는 기법과 고려 사항을 소개한다

 

오류 코드보다 예외를 사용하라

오류 플래그를 설정하거나 호출자에게 오류 코드를 반환하는 방법이 전부였다

if data["result"] == code {
	// success logic
} else if data["result"] == code {
	// error logic
} else {
	// error logic
}

 

하지만 그런 방법을 사용하면 코드가 복잡해진다. 그래서 오류가 발생하면 예외를 던지는 편이 낫다.

swift에서는 에러 핸들링을 할 때 do - catch 문을 사용한다

아래와 같이 에러가 발생하면 throw 로 예외를 던진다

mutating func reservation() throws {
        guard isLoan else {
            throw LoanError.notLoanError
        }
        guard resvCount != 5 else {
            throw ResvError.resvFullError
        }
        
        resvCount += 1
    }

(코드 : https://github.com/devssun/Practice-Project/blob/swift_library/LibraryTDD/LibraryTDDTests/LibraryTDDTests.swift)

오류 처리를 예외로 던짐으로 변경하면서 알고리즘이 분리되어 깔끔한 코드를 확인할 수 있다

 

Try-Catch-Finally 문부터 작성하라

try 블록은 트랜잭션과 비슷하다. try 블록에서 무슨 일이 생기든지 catch 블록은 프로그램 상태를 일관성있게 유지해야한다.

Swift에서는 do-catch-defer 로 사용하지만 defer와 finally 는 차이점이 있다

 

미확인(unchecked) 예외를 사용하라

대규모 시스템에서 호출이 일어나는 방식을 상상해보자

최상위 함수가 아래 함수를 호출하고 아래 함수는 그 아래 함수를 호출한다. 

단계를 내려갈수록 호출하는 함수 수는 늘어난다. 최하위 함수를 변경해 새로운 오류를 던진다고 가정한다면, 변경한 함수를 호출하는 함수 모두가 새로운 예외를 처리해야 하는 연쇄적인 수정이 일어난다.

모든 함수가 최하위 함수에서 던지는 예외를 알아야 하므로 캡슐화가 깨진다.

그래서 무조건 확인된 예외 뿐 아니라 미확인 예외도 확인해야 한다

 

예외에 의미를 제공하라

오류 메시지에 정보를 담아 예외와 함께 던진다

 

호출자를 고려해 예외 클래스를 정의하라

예외 클래스가 하나만 있어도 충분한 코드가 많다. 한 예외는 잡아내고 다른 예외는 무시해도 괜찮은 경우라면 여러 예외 클래스를 사용한다

 

null을 반환하지마라

null을 반환하고픈 유혹이 든다면 그 대신 예외를 던지거나 특수 사례 객체를 반환한다

 

null을 전달하지 마라

메서드로 null을 전달하는 방식은 더 나쁘다. 최대한 피한다.

 

결론

깨끗한 코드는 읽기도 좋아야 하지만 안정성도 높아야 한다

오류 처리를 프로그램 논리와 분리해 독자적인 사안으로 고려하면 튼튼하고 깨끗한 코드를 작성할 수 있다.

반응형