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

FAQ CConsultez toutes les FAQ

Nombre d'auteurs : 35, nombre de questions : 194, dernière mise à jour : 18 février 2018  Ajouter une question

 

Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de www.developpez.com et de l'expérience personnelle des auteurs.

Je tiens à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez devenir rédacteur, lisez ceci .

Sur ce, je vous souhaite une bonne lecture.

SommaireDiversGestion des erreurs (3)
précédent sommaire suivant
 

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.

Code C : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
#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().

Code C : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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 20 septembre 2004 gl

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

Code C : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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 15 mai 2003 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 (dû à 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 :

Code c : Sélectionner tout
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
#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 inciter le système à émettre 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); 
    } 
}

Mis à jour le 23 mars 2009 Melem

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

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 © 2024 Developpez 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.