[Rust] thiserror: 오류 타입 패키지
Rust에서 오류 처리는 은근히 신경 쓰이고 번거로운 부분 중 하나다.
다름이 아니라, 여러 종류의 오류 타입을 뭔가 공통적으로 처리할 때 그렇다.
예를 들어 대충 아래와 같은 오류 타입이 2개 있고

add와 sub 함수가 각각 저 오류를 방출할 수 있다고 가정하겠다.
이 2개의 함수를 하나의 로직에서 하나의 타입처럼 사용하게 하고 싶다면 어떻게 해야할까?
표현성이 좋은 "?" 표현식을 사용하려면 오류 타입이 달라서는 안되기 때문에 그 고민은 더욱 깊어진다.
가장 간단한 해결책은 그냥 Error를 박스로 씌워서 사용하는 것이다.
당장은 매우 쉽게 동작하고, 외부 종속성도 없다.
이런 방법론을 보조해주는 라이브러리가 anyhow인데, 여기서는 다루지 않겠다.
여기엔 당연히 문제도 몇가지 있는데, 일단 동적할당으로 메모리를 먹는다는게 첫번째요.
다중 스레드 환경에서는 또 라이프타임 문제를 해결하기 위해 Send 같은 트레잇을 덕지덕지 발라야만 쓸 수 있다는게 두번째다.
thiserror 사용해보기
thiserror는 이런 여러개의 오류 타입을 enum으로 묶어서 하나의 타입처럼 관리하게 해주는 형태를 취한다.
그냥 박스로 쓰는것보다 성능면에서는 낫다.
먼저 종속성을 추가해준다.
thiserror는 버전 1을 찍은 드문 crate 중 하나다.
그리고 기존의 오류타입 정의를 다 제거하고, 전체 enum 오류의 variant로 정의를 하면 된다.
#[error]는 오류 메세지를 뭘로 출력할 것인지에 대한 속성이다.
그럼 이제 오류를 만들고 반환할때 variant를 반환하면서 저 공통 오류 타입을 사용하면 된다.
그럼 다 하나의 타입처럼 묶어서 사용할 수가 있다.
각 오류 variant에는 따로 제한이 있거나 하진 않다.
오류에 저장할 정보가 있다면 variant 타입으로 추가를 하기만 하면 된다. 그리고 {0} 같은 보간 형태로 출력 형태를 추가해준다.


잘 된다.
근데 뭔가 외부에서 만들어진 오류 타입에 대해서도 처리를 하고 싶을 수가 있다.
아마 자주쓰이는건 이런 io 오류같은게 많을텐데, #[from] 어트리뷰트를 사용하면 자동으로 변환해서 사용되게 할 수 있다.
그렇게 어려울건 없다.
그럼 이런 함수의 오류도 이제
묶어서 처리할 수 있다.