2022. 4. 15. 10:35ㆍProgramming 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))) 반환
}
'Programming Language > Rust' 카테고리의 다른 글
[러스트/Rust] 스마트 포인터(Smart Pointer), 박스(Box<T>) 개념 정리 (0) | 2022.05.30 |
---|---|
[Rust/러스트] 트레잇(trait) 정리 (0) | 2022.02.25 |
[Rust/러스트] 제네릭(Generic) 정리 (0) | 2022.02.23 |
[Rust/러스트] 해쉬맵(HashMap) 다루기 (0) | 2022.02.21 |
[Rust/러스트] 스트링 다루기 (0) | 2022.02.21 |