[Rust/러스트] anyhow 라이브러리 정리

2022. 4. 15. 10:35Programming Language/Rust

반응형

■ anyhow

anyhow는 std::error::error 트레잇의 바운드 작업을 통해 에러를 처리하기 때문에 Rust 응용 프로그램에서 발생할 수 있는 관용적인 오류를 쉽게 처리할 수 있으며, 다양한 기능을 제공합니다.


◆ anyhow!

anyhow 메크로는 인자로 &str, String, std::error::error 트레잇에서 취급하는 모든 에러 타입을 사용할 수 있습니다. 반환값은 anyhow::Error 타입입니다.

use anyhow::{anyhow, Error};

// &str 사용 예시
fn anyhow_test() -> Result<(), Error>{
	return Err(anyhow!("test error"));
}

// String 사용 예시
fn anyhow_test() -> Result<(), Error>{
	return Err(anyhow!(String::from("test error")));
}

// std::io::Error 사용 예시
fn anyhow_test() -> Result<(), Error>{
	return Err(anyhow!(std::io::Error::from(std::io::ErrorKind::NotFound)));
}

◆bail!

bail 메크로는 anyhow 메크로와 동일하게 인자로 &str, String, std::error::error 트레잇에서 취급하는 모든 에러 타입을 사용할 수 있습니다. 반환값은 return Err(anyhow!(...)) 와 같습니다. 따라서 bail 메크로를 쓰는 스코프는 반환값이 Result<_, anyhow::Error> 이어야 합니다.

use anyhow::{anyhow, bail, Error};

// &str 사용 예시
fn bail_test() -> Result<(), Error>{
	bail!("test error");

	// * 동일한 결과
	// return Err(anyhow!("test error"));
}

// String 사용 예시
fn bail_test() -> Result<(), Error>{
	bail!(String::from("test error"));

	// * 동일한 결과
	// return Err(anyhow!(String::from("test error")));
}

// std::io::Error 사용 예시
fn bail_test() -> Result<(), Error>{
	bail!(std::io::Error::from(std::io::ErrorKind::NotFound))

	// * 동일한 결과
	// return Err(anyhow!(std::io::Error::from(std::io::ErrorKind::NotFound)));
}

ensure!

ensure 메크로는 첫번째 인자로 bool 타입을 사용할 수 있으며, 두번째 인자로 다른 메크로와 동일하게 &str, String, std::error::error 트레잇에서 취급하는 모든 에러 타입을 사용할 수 있습니다.

첫번째 인자가 true 일 경우 어떠한 값도 반환하지 않고 종료되며, false 일 경우 두번째 인자에 해당하는 에러를 return Err(anyhow!(...)) 와 같이 반환합니다. 따라서 ensure 메크로를 쓰는 스코프는 반환값이 Result<_, anyhow::Error> 이어야 합니다.

use anyhow::{anyhow, ensure, Error};

// &str 사용 예시
fn ensure_test() -> Result<(), Error>{
	ensure!(false, "test error");
	// * 첫번째 인자가 false일 경우 아래와 동일한 결과
	// return Err(anyhow!("test error"));

	// * 첫번째 인자가 true일 경우를 위해 컴파일러는 Result의 반환을 유도합니다.
	Ok(())
}

// String 사용 예시
fn ensure_test() -> Result<(), Error>{
	ensure!(false, String::from("test error"));
	// * 첫번째 인자가 false일 경우 아래와 동일한 결과
	// return Err(anyhow!(String::from("test error")));

	// * 첫번째 인자가 true일 경우를 위해 컴파일러는 Result의 반환을 유도합니다.
	Ok(())
}

// std::io::Error 사용 예시
fn ensure_test() -> Result<(), Error>{
	ensure!(false, std::io::Error::from(std::io::ErrorKind::NotFound));
	// * 첫번째 인자가 false일 경우 아래와 동일한 결과
	// return Err(anyhow!(std::io::Error::from(std::io::ErrorKind::NotFound)));

	// * 첫번째 인자가 true일 경우를 위해 컴파일러는 Result의 반환을 유도합니다.
	Ok(())
}

◆ context method

Context trait 에서 제공하는 context 메서드는 메서드를 호출한 주체의 Result 에 따라 구분 작업을 합니다.

주체의 Result 가 Ok 일 경우 context의 Result 도 Ok를 반환하고, Err 일 경우 context에 인자로 넣은 Error를 반환합니다. 또한 인자로 &str, String, std::error::error 트레잇에서 취급하는 모든 에러 타입을 사용할 수 있으며, 반환값은 Result<_, anyhow::Error> 입니다.

use anyhow::{bail, Context, Error};

// 에러를 반환하는 예시 함수
fn bail_test() -> Result<(), Error>{
	bail!("bail error")
}

// &str 사용 예시
fn context_test() -> Result<(), Error>{
	bail_test().context("context error")
    
    // * bail_text() 반환값에 따른 구분 작업
    // 1. Ok(()) 일 경우
    // Ok(()) 반환
    
    // 2. Err(Error) 일 경우
    // Err(anyhow!("context error")) 반환
}

// String 사용 예시
fn context_test() -> Result<(), Error>{
	bail_test().context(String::from("context error"))
    
    // * bail_text() 반환값에 따른 구분 작업
    // 1. Ok(()) 일 경우
    // Ok(()) 반환
    
    // 2. Err(Error) 일 경우
    // Err(anyhow!(String::from("context error"))) 반환
}

// std::io::Error 사용 예시
fn context_test() -> Result<(), Error>{
	bail_test().context(std::io::Error::from(std::io::ErrorKind::NotFound))
    
    // * bail_text() 반환값에 따른 구분 작업
    // 1. Ok(()) 일 경우
    // Ok(()) 반환
    
    // 2. Err(Error) 일 경우
    // Err(anyhow!(std::io::Error::from(std::io::ErrorKind::NotFound))) 반환
}

반응형