티스토리 뷰

rust에 예외(exception)가 없다는 거랑 대신 Result<T> / Option<T> 로 해결보는 거, ? 키워드로 Result 로 반환하는 건 책을 보셨다면 다들 아실테고...

Box<dyn Error>와 anyhow::Error

실제 문제는 한 함수 내에서 버블링업할 예외의 타입이 서로 다를 때 발생함. 컴파일이 안 되니까; 나는 에러 AError와 BError 둘 중 하나를 반환해야 하는데, 반환형은 Result<값, AError> 나 Result<값, BError> 둘 중 하나밖에 안 됨. AError와 BError를 동시에 상속받을 수 있는가? 하면 이 언어에는 상속이 없음.

여기에서 trait object 가 등장함. Java / C# 계열 입장에서는 인터페이스로 객체를 다룬다고 생각하면 되고, C++ 개발자 입장에서는 아 이거 dynamic dispatch 가 일어나겠구나 하시면 됨.

trait object 로 타입을 지정하려면, 객체 타입을 기술할 때 dyn Trait이름 이라고 쓰시면 되고, 힙에 있는 포인터니까 Box로 감싸서 Box<dyn Trait 이름>이라고 쓰면 됨.

보통 오류들은 std::error::Error trait 를 구현함. impl std::error::Error for std::io::Error (io::Error는 입출력쪽 에러) 같은 부분도 있으니까 표준이라고 보면 됨. 그럼 이건 AError, BError가 둘다 std::error::Error 를 구현한다는 가정 하에, 공통 인터페이스 역할을 함. 그래서 반환형이 Result<Box<dyn std::error::Error>> 가 되면 ? 연산자로도 반환이 가능해지는 것 (From / Into로 변환됨).

이걸 좀 더 예쁘게 하고 필요한 기능들을 추가해보겠다는게 anyhow::Error (crate anyhow) 같은데, Box<dyn std::error::Error>랑 비슷하다 정도만 알면 되고 자세히 알 필요는 없고 일단 써보는 게 중요할 듯.


그 다음 단계는 anyhow 의 굿즈(좋은 기능들)를 살펴보는 거랑 어떨때에 자체 에러 타입을 만들어야 하느냐는 건데 이건 저도 좀 더 공부해야하는 부분이라 짧게 쓰는 이번 글에는 못 넣겠네요. 더 공부하고 정리해도 괜찮겠다 싶으면 그 때.

최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함