Anuncios

Bienvenidos sean a este post, hoy hablaremos sobre un metodo para los errores.

Anuncios
Anuncios

Si bien dijimos que el compilador nos evitara un monton de errores y situaciones que puedan evitar la correcta ejecucion de nuestro codigo, esto no es 100% efectiva y cuando esto ocurre Rust tiene una macro llamada panic la cual mostrara un mensaje en pantalla, limpiara la memoria y cerrara el programa, pero la limpieza de memoria puede llevar mucho tiempo y para ello en realidad abortaremos el programa inmediatamente y el S.O se encargara de limpiar la memoria por nosotros, pero para esto debemos tener dos situaciones, la primera es que nuestro codigo binario sea lo mas chico posible y la segunda es conffigurar el profile correcto en nuestro archivo Cargo.toml, veamos el siguiente ejemplo:

[profile.release]
panic = 'abort'
Anuncios

En este caso esto es para cuando debemos salir o liberar nuestro programa, vamos a verlo en accion y para ello crearemos un nuevo proyecto que llamaremos errores, una vez creado modificaremos el codigo generado en main.rs con el siguiente:

main.rs

fn main() {
	panic!("This is fine");
}
Anuncios

Un simple llamado al macro panic donde le diremos que muestre un mensaje al momento de ser llamado, 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 'This is fine', src/main.rs:2:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
tinchicus@dbn001vrt:~/lenguajes/rust/errores$
Anuncios

Si observan no devolvera ningun error al compilarlo pero cuando lo ejecutemos nos dira que el main entro en panico y nos mostrara un mensaje en pantalla, esto es una forma de hacer que nuestro codigo entre en panico pero que sucede con los errores? Para ello vamos a modificar el codigo de nuestro ejemplo de la siguiente manera:

main.rs

fn main() 
{
	let v = vec![1, 2, 3];
	println!("{}", v[10]);
}
Anuncios

En este codigo tenemos un vector de 3 elementos y le pedimos que nos muestre la posicion 10, 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 'index out of bounds: the len is 3 but the index is 10', src/main.rs:4:20
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
tinchicus@dbn001vrt:~/lenguajes/rust/errores$
Anuncios

En este caso observemos que entro en panico porque pedimos un dato que esta mas alla de los limites del vector, pero observen que no volvio a fallar el compilador sino que fallo cuando se ejecuto, esto es una forma muy simple de visualizarlo pero podemos ampliar la informacion para saber donde esta el error y para ello podemos usar los que no nos notifica en la salida:

$ RUST_BACKTRACE=1 cargo run
Anuncios

En este caso le pasamos este parametro para que al momeno de correrlo nos de mas detalle, veamos como es su salida:

tinchicus@dbn001vrt:~/lenguajes/rust/errores$ RUST_BACKTRACE=1 cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.03s
     Running `target/debug/errores`
thread 'main' panicked at 'index out of bounds: the len is 3 but the index is 10', src/main.rs:4:20
stack backtrace:
   0: rust_begin_unwind
             at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/std/src/panicking.rs:517:5
   1: core::panicking::panic_fmt
             at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/panicking.rs:100:14
   2: core::panicking::panic_bounds_check
             at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/panicking.rs:76:5
   3: <usize as core::slice::index::SliceIndex<[T]>>::index
             at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/slice/index.rs:184:10
   4: core::slice::index::<impl core::ops::index::Index<I> for [T]>::index
             at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/slice/index.rs:15:9
   5: <alloc::vec::Vec<T,A> as core::ops::index::Index<I>>::index
             at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/alloc/src/vec/mod.rs:2496:9
   6: errores::main
             at ./src/main.rs:4:17
   7: core::ops::function::FnOnce::call_once
             at /rustc/f1edd0429582dd29cccacaf50fd134b05593bd9c/library/core/src/ops/function.rs:227:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
tinchicus@dbn001vrt:~/lenguajes/rust/errores$
Anuncios

E inclusive se puede ver con mas detalle como indica al final pero eso siempre se debe ajustar a sus necesidades, como pueden ver es bueno tener esto a mano porque no siempre nuestro compilador nos protegera de errores que pueden ocurir al momento de ejecucion.

Anuncios

En resumen, hoy hemos visto a panic, que es, como lo utiliza Rust, como podemos invocarlo, como lo invoca el lenguaje, algunas caracteristicas y como podemos tener mas detalles de los errores, 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.

Anuncios
pp258

Donación

Es para mantenimento del sitio, gracias!

$1.50