2013-04-05 1 views
4

J'étudie les standards C++ 11. Je voulais comprendre si error_code et errno liés les uns aux autres? Si oui alors comment? Si non, dans quelles conditions je devrais m'attendre à errno et dans quelles conditions error_code sera défini?error_code vs errno

J'ai fait un petit programme de test pour comprendre cela mais encore un peu confus. S'il vous plaît aider.

#include <iostream> 
#include <system_error> 
#include <thread> 
#include <cstring> 
#include <cerrno> 
#include <cstdio> 

using namespace std; 

int main() 
{ 
    try 
    { 
     thread().detach(); 
    } catch (const system_error & e) { 
     cout<<"Error code value - "<<e.code().value()<<" ; Meaning - "<<e.what()<<endl; 
     cout<<"Error no. - "<<errno<<" ; Meaning - "<<strerror(errno)<<endl; 
    } 
} 

Output - 
Error code value - 22 ; Meaning - Invalid argument 
Error no. - 0 ; Meaning - Success 
+1

Votre titre fait référence à quelque chose appelé 'error_code', mais votre code ne le mentionne pas. –

+1

@Keith: La fonction e.code() retourne l'objet de error_code dont je lis la valeur avec la fonction value. – tshah06

Répondre

6

errno est utilisé par les fonctions que ces documents qui comme un effet secondaire de leur rencontre une erreur - ces fonctions sont la bibliothèque C ou des fonctions OS qui ne jettent des exceptions. system_error est utilisé par la bibliothèque standard C++ lorsque vous utilisez des fonctionnalités de bibliothèque documentées pour lancer cette exception. Complètement séparé. En fin de compte, lisez vos documents!

+0

Alors, pouvons-nous dire commodément que les fonctions de la bibliothèque qui définit error_code n'utiliseront jamais/set errno? – tshah06

+4

@ tshah06 'error_code' n'est pas" défini ". C'est le type (def) d'un attribut de l'exception 'system_error'. Mais nous pouvons commodément dire que les fonctions de bibliothèque * qui lancent une exception 'system_error' * n'utilisent jamais/posent' errno'. Cette dualité n'existe que parce que vous pouvez appeler des fonctions C (en manipulant des erreurs de style C via 'errno') à partir de C++. Dans les exceptions C++ "pures" sont le mécanisme de gestion des erreurs de choix, donc un programme C++ "pur" n'aura jamais à traiter avec "errno". –

+0

@Arne: Donne un sens. Je pense que maintenant je suis assez clair à ce sujet. Merci. – tshah06

Questions connexes