es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Una función de Rust devuelve un futuro, después de .await() puede generar un panic!. ¿Cómo puedo evitar que el panic! detenga el programa?

Estoy haciendo una llamada de función call_data(), la cual retornará un futuro. En la función principal, utilizo una tarea tokio para llamar repetidamente a call_data() cada 60 segundos. En ocasiones, la llamada call_data().await produce un Error, lo que resulta en un panic! y detiene el programa. Intenté hacer lo siguiente: let a = call_data(“nombre”, “tabla”).await; y luego usar match, donde si Ok, el futuro es ejecutado, y si es un Error, continúa. Sin embargo, esto no funciona, ya que si ocurre un panic!, el programa aún fallará. ¿Existe alguna forma de evitar el panic! para este programa? A continuación se muestra el código sin utilizar match.

async fn main() {
let forever = task::spawn(async {
let mut interval = interval(Duration::from_millis(60000));
println!(“Comenzar”);
loop {
interval.tick().await;
call_data(“nombre”, “tabla”).await;
}
});
forever.await;
}

async fn call_data(nombre:&str, tabla: &str){
data().unwrap();
}

Este es el código en que utilizo match

async fn main() {
let forever = task::spawn(async {
let mut interval = interval(Duration::from_millis(60000));
println!(“Comenzar”);
loop {
let a =call_data(“BTC-USD”, “test3”).await;
match a{
Ok=>(),
Err=>continue,
}
}
});
forever.await;
}

async fn call_data(nombre:&str, tabla: &str){
    data().unwrap();
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Puede utilizar el método .unwrap_or_else() para evitar el pánico. Este método devolverá el resultado de la función call_data() o un valor predeterminado si ocurre un error.

    async fn main() {
        let forever = task::spawn(async {
            let mut interval = interval(Duration::from_millis(60000));
            println!("Comienzo");
            loop {
                interval.tick().await;
                let a = call_data("nombre", "tabla").await.unwrap_or_else(|_| {
                    println!("Ha ocurrido un error");
                    // Devuelve un valor predeterminado
                    0
                });
            }
        });
        forever.await;
    }
    
    async fn call_data(name:&str, table: &str){
        data().unwrap();
    }
    

Comments are closed.