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 legiblesanyhow!,bail!yensure!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.