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) 함께 반환하기