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 porthiserrore 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ãoResulteOption.use anyhow::Contexté necessário para habilitar.context()e.with_context()nesses tipos.