Post

throw Exception을 return 처럼 data 반환 용도로 사용하는 것은 불가능하다

[!warning] return 대신 throw Exception 하면서 유용한 객체를 함께 반환하는 것은 불가능하다.
(가능은 하지만 타입 정보가 사라져서 정적 타입 언어를 제대로 사용하는 방법이 아니다.)

return Type 개수 만큼 Exception class를 정의 할 수는 없으니, generic을 이용해 CommonException<T> 같이 정의하고,
data: T에 데이터 담아서 던지면 되는거 아닌가 생각이 들 수 있는데

runtime에는 T가 사라지기 때문에 type-safe한 catching이 불가능하다. (link )
애초에 subclass of ‘throwable’ may not have type parameters 로 컴파일타임 에러가 발생하기 때문에 CommonException을 Generic으로 만들 수 없다.

가능한 방법은 data: Any 로 쓰는 방법 뿐인데, 꺼내는 시점(runtime)에 직접 원하는 타입으로 형변환 해주어야 해서 굉장히 fragile하다.

즉, 성공/실패 여부를 제외한 어떤 programmatic한 정보를 return이 아니라 throw를 이용해서 상위로 전달하는 것은 구조적으로 조금 어색하다.
(나이스하게 처리 할 수 있는 방법이 없다.)

Effective Kotlin 아이템 7. 일단 예외는 정보를 전달하는 방법으로 사용해서는 안된다.

[Effective Kotlin] 1장. 안정성

그렇다면 정상 로직 진행에 실패했음에도 data를 상위 메서드에 전달해야 하는 경우에는 어떻게 해야 하는가?

return (code, data) 함께 반환하기

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