Añadir Contexto a los Errores

El crate anyhow, que se utiliza con frecuencia, puede ayudar a añadir información contextual a los errores y permite tener menos tipos de errores personalizados:

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

fn read_username(path: &str) -> Result<String> {
    let mut username = String::with_capacity(100);
    fs::File::open(path)
        .with_context(|| format!("Failed to open {path}"))?
        .read_to_string(&mut username)
        .context("Failed to read")?;
    if username.is_empty() {
        bail!("Found no username in {path}");
    }
    Ok(username)
}

fn main() {
    //fs::write("config.dat", "").unwrap();
    match read_username("config.dat") {
        Ok(username) => println!("Username: {username}"),
        Err(err)     => println!("Error: {err:?}"),
    }
}
  • anyhow::Result<V> es un alias de tipo para Result<V, anyhow::Error>.
  • anyhow::Error es básicamente un envoltorio alrededor de Box<dyn Error>. Como tal, no suele ser una buena elección para la API pública de una biblioteca, pero se usa con frecuencia en aplicaciones.
  • El tipo de error real que contiene se puede extraer para analizarlo si es necesario.
  • La funcionalidad proporcionada por anyhow::Result<T> puede resultar familiar a los desarrolladores de Go, ya que ofrece patrones de uso y ergonomía similares a (T, error) de Go.