[Rust] anyhow: 오류 처리 패키지

관련 포스트
https://blog.naver.com/sssang97/222979785124

anyhow는 편리한 오류 처리를 위한 편의성 라이브러리다.

thiserror와 양대산맥에 있는데, thiserror가 enum 기반의 구조화되고 상세한 처리를 지향한다면, anyhow는 좀더 단순하고 쌈박한 방식을 제공한다. Box를 좀더 세련된 형태로 꾸며주는 정도라고 봐도 된다.

단순한 Box와의 차이점은, Send+Sync+'static이 더해져서 스레드 간 이동이 보장되고, Backtrace까지 보장된다는 것이 다르다.




설치

디펜던시 하나만 추가하면 된다.

cargo add anyhow




기본 사용법

만약 어떤 형태로든 오류를 뱉는 함수가 이런 식으로 있었다면

아래와 같은 형태로 anyhow Result 래핑을 사용해서 바로 anyhow 에러 타입으로 래핑을 해줄 수 있다.

그러면 복잡한 에러타입의 명시나 핸들링 없이 저 anyhow::Result 하나만으로 대부분의 오류를 제어할 수 있다.

물론 오류 타입의 실제 값을 기반으로 이것저것 처리를 해야한다면 말이 달라지긴 한다.
그럴때는 thiserror를 사용하는 편이 좋다.

이건 오류를 받아서 처리할때 오류 메시지 정도만 있어도 충분할 경우에 적합한 기능이다.

아래는 예제 코드다.

use anyhow::Result;

#[derive(Debug)]
struct SomethingError {
    message: String,
}

impl std::fmt::Display for SomethingError {
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
        write!(f, "SomethingError: {}", self.message)
    }
}

impl std::error::Error for SomethingError {}

fn do_something() -> Result<(), SomethingError> {
    Err(SomethingError {
        message: "Something bad happened".to_string(),
    })
}

fn handle_error() -> anyhow::Result<()> {
    do_something()?;
    Ok(())
}

fn main() {
    match handle_error() {
        Ok(_) => println!("Everything is fine"),
        Err(e) => println!("Error: {}", e),
    }
}


참조
https://docs.rs/anyhow/latest/anyhow/