Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 07/06/2007, à 10:25

ChefWaza

sigaction et exception en C/C++

Bonjour à tous.

J'ai quelques soucis de programmation en C/C++.
Je cherche à provoquer une exception traité par la fonction main quand l'utilisateur fait un CTRL+C.

Voici un code d'exemple (ce n'est pas le code de mon apli, mais un d'exemple) :

La fonction main affiche pouak, attend 30 secondes, puis affiche rata.
Si l'utilisateur fait CTR+C, l'exception doit etre envoyé au main, qui dans l'exemple affiche Arret de l'utilisateur.

Malheureusement, au lieu de m'afficher cela, il m'affiche

terminate called after throwing an instance of 'std::logic_error'
  what():  Arret de l'utilisateur
Aborted

Et il ne rentre pas dans les catch du main.
Voici le code.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h> //signaux
#include <iostream>  //exception
#include <stdexcept>  //exception

/* Macro-fonction qui verifie si une fonction a ete correctement effectue.
Si le valeur -1 est passee en parametre (fonction echouee), le parametre msg est affiche */

#define CHECK(sts,msg) if (sts==-1){throw std::logic_error(msg);}

//EN cas de CTRL+C
void controlc(int sig){
    CHECK(-1,"Arret de l'utilisateur");
}

int main(int argc, char *argv[])
{
  struct sigaction act;

  try
  {
    // remplissage de la structure sigaction pour SIGINT
    act.sa_handler = controlc;
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0; // un appel système interrompu n'est pas repris
    CHECK(sigaction(SIGINT,&act,NULL),"Erreur a l'initialisation de l'interruption SIGINT");

    try
    {
      printf("pouak\n");
      sleep(30);
      printf("rata\n");
    }
    catch ( const std::exception & e )
    {
      fprintf(stdout,"%s\n", e.what());
      throw;
    }
    catch (...)
    {
      fprintf(stdout,"Erreur\n");
      throw;
    }
  }
  catch ( const std::exception & e )
  {
    fprintf(stdout,"%s\n", e.what());
    throw;
  }
  catch (...)
  {
    fprintf(stdout,"Erreur\n");
    throw;
  }
  return 0;
}

Pourquoi je veux absolument traiter l'exception dans le main ? Car il y a certaines variables déclarées dedans que je dois utiliser dans le catch, mais ces variables sont invisibles à la déclaration de la fonction controlc.
Une solution serai de mettre la variable en global, et de traiter les variables dans la fonction controlc, mais c'est bof bof, je ferai cela en dernier recours ...

Merci par avance si vous avez la moindre idée.

Dernière modification par ChefWaza (Le 07/06/2007, à 10:30)

Hors ligne