FAQ CConsultez toutes les FAQ

Nombre d'auteurs : 28, nombre de questions : 175, création le 11 janvier 2013 

 
OuvrirSommaireDiversGestion des erreurs

De nombreuses fonctions en C, positionnent la variable errno pour indiquer le type d'erreur lorsqu'une erreur se produit. Il est possible d'afficher la description de l'erreur grâce à la fonction perror(), déclarée dans stdio.h. Le code suivant permet par exemple d'indiquer la raison de l'échec de l'ouverture d'un fichier.

 
Sélectionnez
#include <stdio.h>
 
...
 
FILE *  f;
 
if ((f = fopen("fic.txt", "r")) == NULL)
{
    /* Affichons la description de l'erreur avec pour titre "fic.txt" */
 
    perror("fic.txt");
}

Il est également possible de récupérer cette chaîne d'erreur plutôt que de l'afficher en utilisant la fonction strerror().

 
Sélectionnez
#include <stdio.h>
#include <errno.h> /* pour errno */
#include <string.h> /* pour strerror */
 
...
 
FILE *  f;
 
if ((f = fopen("fic.txt", "r")) == NULL)
{
    /* Affichons la description de l'erreur avec pour titre "fic.txt" */
 
    fprintf(stderr, "fic.txt: %s.\n", strerror(errno));
}
Mis à jour le 2008-07-27  par gl

Le petit bout de code ci-dessous permet d'obtenir le message correspondant à un n° d'erreur obtenu par GetLastError().

 
Sélectionnez
#include <windows.h>
 
void GetErrorDescription(LPTSTR lpBuffer, DWORD dwBufferSize)
{    
    FormatMessage(
        FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        GetLastError(),
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        lpBuffer,
        dwBufferSize,
        NULL
    );
}
Mis à jour le 2009-06-15  par LFE, Médinoc

En interceptant le signal associé à l'erreur. Les seuls signaux normalisés à ce jour sont :

  • SIGABRT : Le programme est sur le point d'être arrêté prématurément (du à un appel à abort() par exemple).
  • SIGFPE : Une erreur de nature arithmétique s'est produite (par exemple une division par 0).
  • SIGILL : Une instruction illégale a été rencontrée (par exemple une instruction nécessitant un niveau de privilège élevé).
  • SIGINT : Une interruption du programme a été demandée par l'utilisateur (Ctrl + C sous DOS/Windows).
  • SIGSEGV : Une violation d'accès s'est produite (tentative d'écriture dans une mémoire en lecture seulement, etc.).
  • SIGTERM : La terminaison du programme a été demandée.


Il n'est cependant pas requis que le système soit capable de générer lui-même ces signaux (en effet un signal peut être explicitement généré à l'aide de la fonction raise ...). De plus, la norme stipule que dans le cas où le signal généré est SIGFPE, SIGILL ou SIGSEGV, la seule manière portable de le traiter est de mettre fin au programme dans la procédure de traitement du signal (ce qui signifie que celle-ci ne doit pas retourner). Par exemple :

 
Sélectionnez
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
 
void sig_handler(int s);
 
int main(void)
{
    signal(SIGSEGV, sig_handler);
 
    "Bon*our"[3] = 'j'; /* Si "Bon*our" se trouve dans une zone en lecture seule, */
    /* cette instruction va causer le systeme a emetrre le signal SIGSEGV         */
    /* s'il en est capable.                                                       */
 
    printf("Aucun signal recu.\n");
 
    return 0;
}
 
void sig_handler(int s)
{
    if (s == SIGSEGV)
    {
        fprintf(stderr, "Signal SIGSEGV recu.\n");
        exit(EXIT_FAILURE);
    }
}
Créé le 2009-03-23  par Melem
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2013 Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts. Cette page est déposée.