Bienvenidos sean a este post, hoy continuaremos con la manipulacion de los errores.
Hasta los posts anteriores hemos hablado de la macro panic, de como manejarlo con Result y sobre unwrap/expect pero hoy nos centraremos en algo muy utilizado en este y otro lenguajes como es la propagacion de errores, pero que es la propagacion de errores?
Se puede definir como la capacidad de poder devolver el error al codigo llamante para que este decida como procesarlo en lugar de fallar directamente.
El tinchicus
Como podran darse cuenta esto nos dara un mejor control sobre nuestros programas y nos permitira brindar una mejor experiencia al usuario, para entenderlo vamos a ver un simple ejemplo y para ello tomaremos el proyecto que vinimos usando en los posts anteriores, en caso de no tenerlo simplementte generen uno llamado errores, pero antes de continuar vamos a modificar o crear un archivo que llamaremos hola.txt y le agregaremos el siguiente codigo:
hola.txt
tinchicus.com es el mejor lugar para aprender.
Con esto creado vamos a modificar el codigo del archivo main.rs de la siguiente manera:
main.rs
use std::fs::File;
use std::io;
use std::io::Read;
fn leer_archivo() -> Result<String, io::Error> {
let a = File::open("hola.txt");
let mut a = match a {
Ok(archivo) => archivo,
Err(e) => return Err(e),
};
let mut s = String::new();
match a.read_to_string(&mut s){
Ok(_) => Ok(s),
Err(e) => Err(e),
}
}
fn main()
{
println!("{:?}", leer_archivo());
}
Seguimos con nuestra libreria File pero ahora agregamos a io y Read para poder manejar errores y leer archivos respectivamente, despues definiremos una funcion que devolvera un valor de tipo Result pero este devolvera un valor de tipo String y otro de error (io::Error), lo siguiente sera abrir nuestro archivo y almacenarlo en el objeto a, nuestro siguiente paso sera transformarlo en mutable y por medio de match verificamos si se abrio correctamente de lo contrario almacenamos el error, despues de todo esto nuestro siguiente paso sera definir la variable que almacenara el contenido del archivo, y para ello usaremos un match donde por medio del metodo read_to_string lo pasaremos a la variable s, dentro del match chequeamos si esta todo bien lo devolveremos de lo contrario devolveremos un error, por ultimo unicamente nos queda por medio de un println mostrar el resultado de la funcion anterior, compilemos y veamos su salida:
tinchicus@dbn001vrt:~/lenguajes/rust/errores$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/errores`
Ok("tinchicus.com es el mejor lugar para aprender.\n")
tinchicus@dbn001vrt:~/lenguajes/rust/errores$
Como pueden ver nos devolvio el mensaje contenido en el archivo, vamos a quitar los permisos para ver que sucede, para ello debemos ejecutar el siguiente comando en Linux:
$ chmod 000 hola.txt
En Windows simplemente quiten los permisos sobre el archivo (siempre que tengan NTFS) y prueben de ejecutarlo nuevamente a ver que sucede, veamos su salida:
tinchicus@dbn001vrt:~/lenguajes/rust/errores$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.01s
Running `target/debug/errores`
Err(Os { code: 13, kind: PermissionDenied, message: "Permission denied" })
tinchicus@dbn001vrt:~/lenguajes/rust/errores$
Observen como ahora nos devolvio un error informando que no tenemos permisos sobre el archivo, para nuestra ultima prueba eliminen o cambien el nombre del archivo y ejecuten nuevamente el programa para ver cual es su salida:
tinchicus@dbn001vrt:~/lenguajes/rust/errores$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.02s
Running `target/debug/errores`
Err(Os { code: 2, kind: NotFound, message: "No such file or directory" })
tinchicus@dbn001vrt:~/lenguajes/rust/errores$
Ahora nos devolvio que el archivo no fue encontrado, como pueden ver ahora tienen un programa que no solo trabajara con nuestro archivo sino que tambien nos notificara ante alguna eventualidad sin terminar en un panic o una detencion inesperada.
En resumen, hoy hemos visto que es propagacion de errores, una metodologia muy popular en otro lenguajes para poder manejar de mejor manera nuestros posibles errores y que el codigo sea el encargado de determinar que debe hacer, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
