6

Dans le code suivant, à la première itération, j'obtiens une exception, et au second j'obtiens un défaut de segmentation sans message d'erreur imprimé. Il semble que l'exception ne soit pas interceptée:Je reçois un défaut de segmentation au lieu d'une exception

int i = 0; 
while(i++ < 10) 
{ 
    try { 
     cout << "Iteration: " << i << endl; 
     // Code... 
     cout << "OK" << endl; 
    } 
    catch(...) 
    { 
     cerr << "Error message" << endl; 
     continue; 
    } 
} 

Output: 
Iteration 1 
Error message 
Iteration 2 
Segmentation fault 

Est-ce normal, ou est-ce que quelque chose ne va vraiment pas?

Dans le cas où cela devrait être pertinent, dans ce bloc de code, je réinitialise une connexion MySQL, et l'exception est générée lorsque je vérifie si la connexion est fermée.

Merci.


Plate-forme:
Linux - OpenSuse 11,4
C++ - GCC 4.5.1
Intel Xeon

+2

défauts de segmentation sont. Je ne suis pas attrapé par 'try-catch' Vous devriez utiliser un débogueur pour l'attraper à la place –

+10

Je suis à peu près sûr qu'il doit être dans votre' // Code ... '. Vous ne pouvez pas repérer les taches de segfault dans ce que vous avez posté. – kratenko

+0

J'ai réussi à dupliquer votre sortie en écrivant 'if (i == 1) throw 0, sinon i = * (int *) 0;' mais ce n'est pas ce que fait votre '// Code', n'est-ce pas? –

Répondre

16

Étant donné que les erreurs de segmentation ne sont pas provoquées (directement) par le logiciel, mais par le processeur détectant que vous essayez d'accéder à la mémoire invalide (ou à la mémoire invalide - par exemple mémoire qui n'est pas censée être exécutée, etc), il n'est pas "attrapable" avec try/catch, qui est conçu pour attraper un logiciel qui lève une exception. Ils sont tous deux appelés des exceptions, mais ils proviennent de différents niveaux du logiciel/matériel du système. Techniquement, vous pouvez intercepter les erreurs de segment avec un gestionnaire de signal pour SIGSEGV. Cependant, comme l'explique Ivaylo, il n'est généralement pas permis de "réessayer" si vous avez un problème de segmentation. Le hander de signal pour SIGSEGV est autorisé à longjmp ou exit, mais ne devrait pas simplement retourner.

En savoir plus sur les signaux ici: http://www.alexonlinux.com/signal-handling-in-linux

typiques exceptions C++ (résultat de throw) peut être rejugé sans problème (bien sûr, la même exception peut être de nouveau jeté, bien sûr

5

Vous ne pouvez pas attraper erreur de segmentation comme ça. Cette erreur est généralement irrécupérable et n'est pas gérée par le try-catch habituel. Cela signifie que quelque chose est allé très probablement mauvaise corruption de pile ou similaire. Essayez d'utiliser valgrind pour détecter les causes de l'erreur de segmentation. Les clauses

+4

Segfaults se produit également lors du déréférencement d'un pointeur invalide (null ou pointant vers une zone non allouée), ce qui est une erreur assez commune, rien de dramatique comme une corruption de pile. – syam

1

catch interceptent les exceptions renvoyées par les expressions throw. En standard C++ (et dans n'importe quelle implémentation C++ saine), ils font pas erreurs de capture détectées par le système d'exploitation ou par le matériel. Faire autrement rendrait beaucoup trop difficile l'écriture de code de sécurité.

Questions connexes