IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Rust Discussion :

Result ou Option ? Quelle solution ?


Sujet :

Rust

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Janvier 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Janvier 2018
    Messages : 22
    Par défaut Result ou Option ? Quelle solution ?
    Bonjour
    Je me tourne une nouvelle fois vers vous car je peine à gérer le comportement d'une erreur prévu.
    Je fais un petit listener réseaux en UDP et je veux gérer le timeout du temps d'écoute du port, mais quand je le fais plutôt que de fermer le port et continuer il se met en panic normal.
    Sans mon timeout et avec une machine accessible pas de soucis cela fonctionne
    Si jamais la machine en face n'est pas allumée ou ne répond pas le port reste en écoute et là ça me bloque . D'où le besoin d'un timeout pour gérer ce cas.
    Je voulais utiliser un Result pour gérer l'erreur mais je n'arrive pas à le mettre en place, pareil pour Option. Quelqu'un pourrait-il m'aider s'il vous plait ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
     
    fn reception() -> Result<(), io::Error>{
     
        let iphost = Ipv4Addr::new(192, 168, 11, 131);
        let connection = SocketAddrV4::new(iphost, 9992);
     
        // Bind the socket
        let socket = UdpSocket::bind(connection).expect("can't bind");
        //creation du buffer de reception
        let mut buf = [0;1024] ;
     
        //timeout si la machine ne repond pas 
        socket.set_read_timeout(Some(Duration::from_secs(2)))?;
     
        //reception des donnees UDP dans le buffer
        // ca plante en cas de timeout et je n'arrive pas à mettre en place un Result ou Option à la place du expect qui me vire
        //
        let (amt,_src) =socket.recv_from(&mut buf).expect("receive...nothing");
     
        //Ci-dessous sur les 3 lignes l'un de mes essais 
        //if let Some(amt,_src)=socket.recv_from(&mut buf).expect("receive...nothing"){ 
        //       println!("recu: {:?}", &buf[0..amt]);
        // }else{return}
     
        //lecture des donnees sur le port
        println!("recu: {:?}", &buf[0..amt]);
     
        Ok(())
    }
    Merci d'avance pour votre aide

  2. #2
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    Ta tentative avec "if let" est presque bonne. Le soucis est que contrairement au type Option qui a comme variant Some(valeur) et None, le type Result a comme variant Ok(valeur) et Error(err). Tu peux donc traiter l'erreur en utilisant simplement Ok à la place de Some.

    Ceci dit, vu que tu souhaites faire un return dans le bloc else, c'est encore plus simple d'utiliser le ? à la place du .expect("...") pour ta fonction recv_from(...) pour remonter directement l'erreur au niveau supérieur, ce qui semble particulièrement adapté dans ton cas vu que ta fonction retourne déjà un Result<(),io::Error>

  3. #3
    Membre averti
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Janvier 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Janvier 2018
    Messages : 22
    Par défaut Super
    C'est ce que je cherchais. J'ai cru que "?" c'était juste pour cacher la poussière sous le tapis la version simplifié de unwrap

    Merci beaucoup pour cette aide

  4. #4
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 690
    Par défaut
    Les unwarp et expect sont normalement à réserver pour les erreurs que l'on ne sait pas traiter et pour lesquelles il vaut mieux par prudence interrompre le programme. Le expect a l'avantage de fournir un message d'erreur.

    Le point d'interrogation permet au contraire à remonter proprement l'erreur à la méthode appelante pour pouvoir la traiter là bas. C'est le plus souvent ce que l'on souhaite mettre en place. Ça marche directement dans ton cas car toutes les erreurs sont de type io::Error. Si tu dois gérer des erreurs qui sont de types différents, je te conseille la crate anyhow qui propose un type d'erreur chapeau.

  5. #5
    Membre averti
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Janvier 2018
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Janvier 2018
    Messages : 22
    Par défaut Merci
    Merci pour toutes ces précisions cela me sera utile .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Choix] Quelle solution de CMS en PHP choisir pour la simplicité ?
    Par Tofalu dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 49
    Dernier message: 29/08/2011, 21h58
  2. [Outils][C#] Quelle solution pour Animations 2D de Jeux ?
    Par orelero dans le forum EDI/Outils
    Réponses: 2
    Dernier message: 01/02/2006, 18h45
  3. Réponses: 2
    Dernier message: 26/10/2005, 17h25
  4. [Constantes] Quelle solution adopter ?
    Par animageo dans le forum Général Java
    Réponses: 16
    Dernier message: 10/02/2005, 11h43
  5. [Intranet] Quelle solution choisir ?
    Par stailer dans le forum Développement
    Réponses: 6
    Dernier message: 06/09/2003, 01h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo