티스토리 뷰
- 기본: the book (생략)
- 초보자용 개괄: http://www.sheshbabu.com/posts/rust-error-handling/
- 리얼 앱에서: https://www.lpalmieri.com/posts/error-handling-rust/
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
- Oracle Cloud Infrastructure
- javascript
- 쿠버네티스
- scss
- 마스토돈
- gitea
- 토이프로젝트
- 개발기록
- Sass
- ActivityPub
- c++
- 오라클 클라우드
- pleroma
- OStatus
- 오라클 클라우드 인프라
- upbit
- 업비트
- exercism
- mvu
- 왜 생각이 안 났지
- pdf.js
- C++ FAQ
- kotlin당했다
- 시스어드민
- vuex
- Godot Engine
- ArchLinuxARM
- K8s
- C#
- rust-lang
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |