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

Bibliothèques Discussion :

attraper un crash dans une fonction d'une bibliothèque


Sujet :

Bibliothèques

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut attraper un crash dans une fonction d'une bibliothèque
    Bonjour,

    Mon application fait appel a une fonction d'une bibliothèque externe (dont je n'ai que la DLL, pas de sources).
    Malheureusement, l'appel à cette fonction plante selon la valeur que je lui donne (et je n'ai aucun moyen de savoir avant l'appel, si cette valeur va provoquer le crash ou pas).

    J'ai donc essayé de mettre l'appel dans un bloc try-catch (avec les exceptions enclenchées pour mon projet) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try
    {
       appel_externe(ma_valeur);
    }
    catch
    {
       // erreur
    }
    Le problème, c'est que ça crash quand même dans le bloc try, ce que je ne m'explique pas : si ça crash dans le try, n'est justement pas le but du catch, d'éviter que l'application plante et me laisser la possibilité de récupérer l'erreur ?

    Quelqu'un peut-il m'expliquer/m'aider ?
    Merci !
    Jérôme


    [Balises CODE rajoutées par Loulou24, merci d'y penser à l'avenir]

  2. #2
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Non les exceptions ne sont pas des magiennes. Elles servent à trouver où des exceptions ont été levées mais pour ça il faut bien que quelqu'un les ait levées...

    Voir la à ce propos : http://c.developpez.com/faq/cpp/?page=exceptions

    Donc pour ton problème, il faut voir dans la doc de ta bibliothèque. Si elle est en C, tu dois sûrement pouvoir t'en tirer avec des tests de retours de fonction. Et en C++, renseigne-toi sur le type d'exceptions que ta bibliothèque peut lever si elle le fait.
    Fiquet
    - FAQ SDL
    - FAQ C++

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour ta réponse et le lien sur le FAQ.

    Si je comprend bien, si la bibliothèque que j'utilise (qui est en C++) ne lève pas d'exception, je ne peut rien faire pour éviter le crash de mon application...

    Merci !
    Jérôme

  4. #4
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Ben si quand même. Tester toi même ce que tu y mets, voir si c'est cohérent, etc. Si ça l'est ton programme ne devrait pas planter, à moins que ta bibliothèque est buguée mais la tu ne peux rien faire.

    Mais as-tu consulté la doc ? Il y a peut-être quelque-chose pour vérifier, ou alors une indication sur la plage de valeurs supportées, etc.
    Fiquet
    - FAQ SDL
    - FAQ C++

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    je ne pense pas pouvoir faire quoi que ce soit. Voici plus de détails :

    La fonction que j'appelle prend une chaîne de caractères en entrée et évalue cette chaîne comme formule mathématique. La fonction retourne ensuite le résultat.

    Par exemple, je lui donne "5*pi/2" et elle me retourne le résultat sous forme d'un double.

    Si je lui donne "tan(pi/2)", ça plante, ce qui s'explique, car la tangente de 90°, c'est infini. Mais, si je veux tester la validité de cette entrée avant d'appeler la fonction qui plante, tout l'intérêt de la chose est perdu, car je devrais refaire le travail d'évaluation de la chaîne.

    Voilà pourquoi j'en conclus que je ne peux rien faire : la fonction plante, ne lève apparement pas d'exception et mon application crash.

    Jérôme

  6. #6
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 751
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 751
    Points : 10 667
    Points
    10 667
    Billets dans le blog
    3
    Par défaut
    intercepte les segfault sous VC++. Mais je ne sais pas ce qu'il en est des autres compilos. Et pour les autres OS, je ne sais pas si on peut gérer ça avec des exceptions (-> signaux).

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/11/2007, 14h44
  2. Réponses: 2
    Dernier message: 17/04/2007, 17h14
  3. Réponses: 3
    Dernier message: 29/04/2006, 13h02
  4. Réponses: 3
    Dernier message: 16/01/2006, 16h02
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

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