thiserror
e anyhow
The thiserror
and anyhow
crates are widely used to simplify error handling.
thiserror
is often used in libraries to create custom error types that implementFrom<T>
.anyhow
is often used by applications to help with error handling in functions, including adding contextual information to your errors.
use anyhow::{bail, Context, Result}; use std::fs; use std::io::Read; use thiserror::Error; #[derive(Clone, Debug, Eq, Error, PartialEq)] #[error("Nome de usuĂĄrio nĂŁo encontrado em {0}")] struct EmptyUsernameError(String); fn read_username(path: &str) -> Result<String> { let mut username = String::with_capacity(100); fs::File::open(path) .with_context(|| format!("Falha ao abrir {path}"))? .read_to_string(&mut username) .context("Falha ao ler")?; if username.is_empty() { bail!(EmptyUsernameError(path.to_string())); } Ok(username) } fn main() { //fs::write("config.dat", "").unwrap(); match read_username("config.dat") { Ok(username) => println!("Nome do usuĂĄrio: {username}"), Err(err) => println!("Erro: {err:?}"), } }
This slide should take about 5 minutes.
thiserror
- A macro
Error
Ă© fornecida porthiserror
e possui vĂĄrios atributos Ășteis para ajudar a definir tipos de erro de forma compacta. - O trait
std::error::Error
Ă© derivado automaticamente. - A mensagem de
#[error]
Ă© usada para derivar o traitDisplay
.
anyhow
anyhow::Error
Ă© essencialmente um wrapper em torno deBox<dyn Error>
. Como tal, geralmente nĂŁo Ă© uma boa escolha para a API pĂșblica de uma biblioteca, mas Ă© amplamente utilizado em aplicaçÔes.anyhow::Result<V>
Ă© um alias de tipo paraResult<V, anyhow::Error>
.- O tipo de erro real dentro dele pode ser extraĂdo para exame, se necessĂĄrio.
- A funcionalidade fornecida por
anyhow::Result<T>
pode ser familiar para desenvolvedores Go, pois fornece padrÔes de uso e ergonomia semelhantes a(T, error)
de Go. anyhow::Context
Ă© um trait implementado para os tipos padrĂŁoResult
eOption
.use anyhow::Context
Ă© necessĂĄrio para habilitar.context()
e.with_context()
nesses tipos.