thiserror
e anyhow
Os crates thiserror
e anyhow
são amplamente utilizados para simplificar o tratamento de erros.
thiserror
é frequentemente usado em bibliotecas para criar tipos de erro personalizados que implementamFrom<T>
.anyhow
é frequentemente usado por aplicações para ajudar no tratamento de erros em funções, incluindo adicionar informações contextuais aos seus erros.
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.