Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre dos metodos para manejar posibles errores.

Anuncios

En el post anterior trabajamos con Result y sus dos datos genericos para poder manipular los errores, si bien esto funciona de manera mas que correcta puede convertir nuestro codigo en uno muy complejo de forma innecesaria.

Anuncios
Anuncios

Para ello tenemos estos dos metodos, los cuales ya hemos aplicado en otros posts y nos permitian poder manejar errores a la hora de trabajar con nuestros codigos, nosotros principalmente los utilizamos para el manejo de los archivos, pero si los dos hacen lo mismo, cual es la diferencia? Basicamente, unwrap nos dara un detalle del error y listo, en cambio expect nos permite mostrar un mensaje para detallar mejor el error y entregara el mismo mensaje que unwrap, el mas utilizado es expect simplenente por la capacidad del mensaje pero cuando busquen ejemplos veran a unwrap porque se implementa de forma mas sencilla.

Anuncios

Basta de chachara, vamos a los bollos, para ello vamos a tomar el ejemplo del post anterior, sino lo tienen simplemente generen un nuevo proyecto y deben llamarlo errores, vamos al archivo main.rs y modificaremos el codigo existente de la siguiennte manera:

main.rs

use std::fs::File;

fn main() 
{
	let _ = File::open("hola.txt").unwrap();
}
Anuncios

En este caso le decimos que habra el archivo hola.txt y atras usamos el unwrap, si vienen del post anterior la ultima accion sobre este archivo fue quitar los permisos sobre el mismo para no poder acceder, en cambio si crearon el proyecto este archivo no existe, en cualquiera de los dos casos nos devolvera un error, compilemos y veamos su salida:

tinchicus@dbn001vrt:~/lenguajes/rust/errores$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.02s
     Running `target/debug/errores`
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }', src/main.rs:5:36
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
tinchicus@dbn001vrt:~/lenguajes/rust/errores$
Anuncios

En mi caso nos devolvio un error de PermissionDenied con algunos datos mas para entender cual fue la falla, vamos a tomar el codigo anterior y lo vamos a modificarlo de la siguiente manera:

main.rs

use std::fs::File;

fn main() 
{
	let _ = File::open("hola.txt").expect("Ha ocurrido algo!!!");
}
Anuncios

Como pueden ver se maneja de la misma forma pero ahora podemos pasar un mensaje, puse algo simple pero pueden pasar algo que les indique mejor la falla o que deben observar, 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`
thread 'main' panicked at 'Ha ocurrido algo!!!: Os { code: 13, kind: PermissionDenied, message: "Permission denied" }', src/main.rs:5:36
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
tinchicus@dbn001vrt:~/lenguajes/rust/errores$
Anuncios

Observen que nos devolvio el mismo tipo de error con todos los detalles pero ahora de manera adicional tenemos el mensaje que le pasamos al metodo, como pueden ver son maneras mas simples de recurrir a panic sin necesidad de tener que usar el match para un Result, y tal como vimos en otros posts tambien nos ayudan para otros temas.

Anuncios

En resumen, hoy hemos visto dos metodos que nos permiten de manera rapida ejecutar a panic ante cualquier eventualidad, por un lado tenemos a unwrap que ha perdido algo de popularidad pero sigue siendo el mas practico de implementar, por el otro tenemos a expect que gano mas terreno por el simple hecho de mostrar un mejor detalle gracias al mensaje, ambos trabajan de manera eficiente y hemos visto un par de ejemplos para verlos en accion, espero les haya sido de utilidad 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.

Anuncios

Donación

Es para mantenimento del sitio, gracias!

$1.50