Post
KO

예외를 허용하지 않는 오류 처리

Functional Programming in Scala P.59

예외를 던지는 것이 하나의 부수 효과임을 간단히 언급했다.

실패 상황과 예외를 보통의 값으로 표현 할 수 있으며, 일반적인 오류 처리-복구 패턴을 추상화한 고차 함수를 작성하는 방법에 대해 알아보자.

오류를 값으로 돌려준다는 함수적 해법은 더 안전하고 참조 투명성을 유지한다는 장점이 있다.

게다가 고차 함수 덕분에 예외의 주된 이점인 **오류 처리 논리의 통합(consolidation of error-handling logic) **도 유지된다.

def failingFn(i: Int): Int = { val y : Int = throw new Exception("fail") try { val x = 42 + 5 x + y } catch { case e : Exception => 43} }

위 코드를 보면 y가 참조에 투명하지 않다는 것을 증명할 수 있다.

참조 투명성이라는 것을, 참조에 투명한 표현식의 의미는 문맥(context)에 의존하지 않으며 지역적으로 추론할 수 있지만 참조에 투명하지 않은 표현식의 의미는 문맥에 의존적이고(context-dependent) 좀 더 전역의 추론이 필요하다는 것으로 이해해도 될 것이다.

예외 (try catch)를 사용했을 때 주된 문제의 두가지는 다음과 같다.

  • 예외는 참조 투명성을 위반하고 문맥 의존성을 도입한다.

  • 예외는 형식에 안전하지 않다.

failingFn 함수 형식인 Int => Int 만 보고는 이 함수가 예외를 던질 수 있다는 사실을 전혀 알수 없으며, 그래서 컴파일러는 failingFn의 호출자에게 그 예외들을 처리하는 방식을 결정하라고 강제할 수 없다. 프로그래머가 실수로 failingFn의 예외 점검 코드를 추가하지 않으면 그 예외는 실행시점에서야 검출된다.

“예외를 던지는 대신, 예외적인 조건이 발생했음을 뜻하는 값을 돌려준다”

(한마디로 함수형으로 작성시에는 예외를 포함하고 있을 수 있다는 것을 반환값 타입으로 나타낸다? 이런 것인가 싶다 -_-;)

위의 문제점을 기반으로 작성하게 되면 오류 처리 전략은 형식에 완전히 안전하며, 최소한의 구문적 잡음으로도 스칼라의 형식 점검기의 도움을 받아서 실수를 미리 발견할 수 있다.

This article is licensed under CC BY 4.0 by the author.