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 implement From<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 por thiserror 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 trait Display.

anyhow

  • anyhow::Error Ă© essencialmente um wrapper em torno de Box<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 para Result<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ĂŁo Result e Option. use anyhow::Context Ă© necessĂĄrio para habilitar .context() e .with_context() nesses tipos.