Rust:
Manejo de errores

Cómo hacerlo:

Rust maneja los errores de dos maneras principales: errores recuperables e irrecuperables. Vamos a ver ambos.

Los errores recuperables utilizan Result<T, E>:

use std::fs::File;

fn open_file(filename: &str) -> Result<File, std::io::Error> {
    let f = File::open(filename);
    
    match f {
        Ok(file) => Ok(file),
        Err(e) => Err(e),
    }
}

fn main() {
    match open_file("hello.txt") {
        Ok(_file) => println!("Archivo abierto exitosamente."),
        Err(_e) => println!("No se pudo abrir el archivo."),
    }
}

La salida podría ser “Archivo abierto exitosamente.” o “No se pudo abrir el archivo.” dependiendo de tu hello.txt.

Para errores irrecuperables, usamos panic!:

fn main() {
    // Esto causará que el programa entre en pánico porque probablemente el archivo no exista.
    let _f = File::open("nowhere.txt").unwrap();
}

Ejecútalo y verás un mensaje de pánico. Tu programa se detiene en seco.

Inmersión Profunda

Históricamente, el manejo de errores en programación ha sido un lío. Rust lo hace bien con una clara distinción entre errores recuperables e irrecuperables.

El enum Result es para errores recuperables. Es explícito: manejas la variante Ok o Err. También tienes métodos como unwrap() y expect(), pero son atajos rápidos y sucios que pueden llevar a un panic!.

panic! es la forma en que Rust grita que algo realmente malo ha ocurrido y no puede lidiar con ello. Es como un error irrecuperable que detiene la ejecución de inmediato. Un pánico en Rust a menudo se siente con errores que no esperas manejar, como indizar fuera de los límites de un arreglo.

El manejo de errores devolviendo un Result se prefiere cuando esperas lidiar con errores. Es el Rust idiomático, lo que significa que es la forma en que los desarrolladores de Rust acordaron hacer las cosas. También está Option<T>, para casos en que un error es simplemente algo que es None en lugar de Some(T). Se trata de esperar lo inesperado sin miedo.

¿Alternativas? Claro, podrías usar otros crates de manejo de errores para más funciones o uso ergonómico. Como anyhow para manejo de errores simple, o thiserror para errores en código de biblioteca.

Ver También

¿Interesado en profundizar más? Aquí es donde ir:

Recuerda, un buen manejo de errores no es solo codificar; es cuidar a los usuarios de tu código. ¡Feliz codificación!