Aprende Rust · Guía 5 de 8 · 2 min

Option y Result: errores sin excepciones ni null

Cómo maneja Rust la ausencia de valores y los errores, y qué hace el operador ?.

Rust no tiene null ni excepciones. Usa dos tipos que obligan a considerar el caso negativo.

Option: puede que no haya valor

fn buscar(ids: &[u32], id: u32) -> Option<usize> {
    ids.iter().position(|&x| x == id)
}

fn main() {
    match buscar(&[1, 2, 3], 2) {
        Some(i) => println!("Posición {i}"),
        None => println!("No existe"),
    }
}

La firma ya avisa que el valor puede faltar, y no puedes usarlo sin comprobarlo. Desaparece así el clásico error de referencia nula.

Result: puede fallar

leer_config()Ok(texto): siguesErr(e): lo atiendes
Los dos caminos están en el tipo, y el compilador te obliga a atender ambos. Con ?, el error sube a quien llamó.
use std::fs;
use std::io;

fn leer_config(ruta: &str) -> Result<String, io::Error> {
    let texto = fs::read_to_string(ruta)?;
    Ok(texto.trim().to_string())
}

fn main() {
    match leer_config("app.toml") {
        Ok(t) => println!("{t}"),
        Err(e) => eprintln!("No pude leerla: {e}"),
    }
}

El operador ?

El ? significa: si esto falló, devuelve el error a quien me llamó; si no, dame el valor. Mantiene el código corto sin ocultar que puede fallar.

Cuidado con unwrap

.unwrap() extrae el valor y detiene el programa si no existe. Sirve en ejemplos y pruebas, pero en producción convierte un error manejable en una caída del servicio.

Prefiere ?, match, o métodos como .unwrap_or() y .unwrap_or_default().

Construye mejor software.

Seguridad, eficiencia y oficio, con fuentes y en español.