Adicionando Contexto aos Erros

O crate anyhow Ă© amplamente usado e pode lhe ajudar a adicionar informaçÔes contextuais aos seus erros, permitindo que vocĂȘ tenha menos tipos de erros personalizados:

use std::{fs, io};
use std::io::Read;
use anyhow::{Context, Result, bail};

fn ler_nome_usuario(caminho: &str) -> Result<String> {
    let mut nome_usuario = String::with_capacity(100);
    fs::File::open(caminho)
        .with_context(|| format!("Falha ao abrir {caminho}"))?
        .read_to_string(&mut nome_usuario)
        .context("Falha ao ler")?;
    if nome_usuario.is_empty() {
        bail!("Nome de usuĂĄrio nĂŁo encontrado em {caminho}");
    }
    Ok(nome_usuario)
}

fn main() {
    //fs::write("config.dat", "").unwrap();
    match ler_nome_usuario("config.dat") {
        Ok(nome_usuario) => println!("nome_usuario: {nome_usuario}"),
        Err(err)     => println!("Erro: {err:?}"),
    }
}
  • anyhow::Result<V> Ă© um apelido de tipo para Result<V, anyhow::Error>.
  • 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.
  • 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.