0Pricing
Learn Rust Coding · Lección

anyhow

Errores flexibles en aplicaciones

anyhow es una lección gratuita de Learn Rust Coding en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Learn Rust Coding, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Learn Rust Coding incluye 4 lecciones en total.

Errores flexibles para aplicaciones

En el código de una aplicación, a menudo solo quiere propagar los errores con contexto, sin definir un enum tipado para cada uno. El crate anyhow proporciona un único tipo de error sencillo para ese fin.

Añadir anyhow

Añádalo como dependencia. Se combina bien con thiserror: thiserror para bibliotecas y anyhow para binarios.

[dependencies]
anyhow = "1.0"

El alias anyhow::Result

anyhow::Result<T> es una abreviatura de Result<T, anyhow::Error>. El tipo Error puede contener cualquier error que implemente std::error::Error.

use anyhow::Result;

fn load() -> Result<String> {
    let text = std::fs::read_to_string("config.txt")?;
    Ok(text)
}

Conversión automática

El operador ? convierte automáticamente cualquier error estándar en anyhow::Error, por lo que puede combinar tipos de error libremente.

use anyhow::Result;

fn parse_file(path: &str) -> Result<i32> {
    let text = std::fs::read_to_string(path)?; // io error
    let n: i32 = text.trim().parse()?;          // parse error
    Ok(n)
}

Añadir contexto

El método .context() añade un mensaje comprensible para las personas a un error y crea una cadena legible cuando algo falla.

use anyhow::{Context, Result};

fn read_config(path: &str) -> Result<String> {
    let text = std::fs::read_to_string(path)
        .context("failed to read config file")?;
    Ok(text)
}

Contexto diferido

Use with_context cuando construir el mensaje sea costoso o necesite datos de ejecución; el cierre solo se ejecuta si se produce un error.

use anyhow::{Context, Result};

fn open(path: &str) -> Result<String> {
    std::fs::read_to_string(path)
        .with_context(|| format!("could not open {path}"))
}

Crear errores ad hoc

La macro anyhow! crea un error a partir de un mensaje, y bail! devuelve uno de forma temprana.

use anyhow::{anyhow, bail, Result};

fn check(age: i32) -> Result<()> {
    if age < 0 {
        bail!("age cannot be negative");
    }
    if age > 150 {
        return Err(anyhow!("age {age} is implausible"));
    }
    Ok(())
}

Usar ensure!

ensure! funciona como assert!, pero devuelve un error en lugar de provocar un panic.

use anyhow::{ensure, Result};

fn divide(a: i32, b: i32) -> Result<i32> {
    ensure!(b != 0, "division by zero");
    Ok(a / b)
}

anyhow en main

Devuelva anyhow::Result<()> desde main para obtener cadenas de errores con un formato claro cuando se produzca un fallo.

use anyhow::Result;

fn main() -> Result<()> {
    let text = std::fs::read_to_string("data.txt")?;
    println!("{text}");
    Ok(())
}

Inspeccionar la causa

Aunque anyhow::Error sea opaco, aún puede inspeccionarlo. downcast_ref recupera un tipo de error concreto cuando necesita tomar decisiones basadas en él.

use anyhow::Result;

fn report(err: anyhow::Error) {
    if let Some(io) = err.downcast_ref::<std::io::Error>() {
        println!("io error: {io}");
    } else {
        println!("other error: {err}");
    }
}

thiserror frente a anyhow

Regla general:

  • thiserror — bibliotecas y errores tipados sobre los que quien las use pueda hacer coincidencias
  • anyhow — aplicaciones, para propagar errores con contexto

Puede convertir un error de thiserror en anyhow mediante ? de forma transparente.

Comprobación rápida

¿Qué método de anyhow añade un mensaje descriptivo a un error mientras se propaga?

Resumen

Ha aprendido el crate anyhow:

  • anyhow::Result<T> usa un único tipo de error flexible
  • ? convierte automáticamente cualquier error estándar
  • .context() / with_context() añaden mensajes legibles
  • anyhow!, bail! y ensure! crean errores
  • Es ideal para código de aplicaciones (binarios)

Preguntas frecuentes

¿La lección «anyhow» es gratis?

Sí — el texto completo de «anyhow» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Learn Rust Coding, actualiza a CoddyKit PRO. El curso de Learn Rust Coding incluye 4 lecciones en total.

¿Qué aprenderé en «anyhow»?

Errores flexibles en aplicaciones Practicas Learn Rust Coding con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Learn Rust Coding?

No se requiere experiencia previa. Learn Rust Coding en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.

¿Cuánto tiempo toma la lección «anyhow»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Learn Rust Coding?

Sí. Cada lección de Learn Rust Coding incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Result y el operador ?
  2. thiserror
  3. anyhow
  4. Conversión de errores
← Volver a Learn Rust Coding