2010-10-23 6 views
3

D'abord, je trouve dans cplusplus.com la citation suivante:Catch avec plusieurs paramètres

Le format de capture est similaire à une fonction régulière qui a toujours au moins un paramètre.

Mais j'ai essayé ceci:

try 
{ 
    int kk3,k4; 
    kk3=3; 
    k4=2; 
    throw (kk3,"hello"); 
} 
catch (int param) 
{ 
    cout << "int exception"<<param<<endl;  
} 
catch (int param,string s) 
{ 
    cout<<param<<s; 
} 
catch (char param) 
{ 
    cout << "char exception"; 
} 
catch (...) 
{ 
    cout << "default exception"; 
} 

Le compilateur ne se plaint pas de le lancer avec des accolades et de multiples arguments. Mais il se plaint en fait de la prise avec des paramètres multiples malgré ce que dit la référence. Je suis confus. Est-ce que try et catch permettent cette multiplicité ou non? Et si je voulais lancer une exception qui comprend plus d'une variable avec ou sans le même type.

+0

Lire sur l'opérateur virgule. Vous ne lancez pas '(kk3," hello ")', vous lancez "" hello "'. – delnan

+0

donc c'est seulement un argument dans les deux? –

Répondre

10

(kk3, "bonjour") est une expression virgule. L'expression virgule évalue tous ses arguments de gauche à écrire et le résultat est l'argument le plus à droite. Ainsi, dans l'expression

int i = (1,3,4); 

i 4.

devient

Si vous voulez vraiment jeter les deux (pour une raison quelconque), vous pouvez jeter comme ça

throw std::make_pair(kk3, std::string("hello")); 

et attraper comme ceci:

catch(std::pair<int, std::string>& exc) 
{ 
} 

Et une clause de capture a exactement sur l'argument e ou

... 

HTH

+0

merci beaucoup :) c'était très utile. –

2

Outre les autres réponses, je vous recommande de créer votre propre classe d'exception qui peut contenir plus d'un élément d'information. Il devrait préférablement dériver de std::exception. Si vous en faites une stratégie, vous pouvez toujours attraper vos exceptions avec un seul catch(std::exception&) (utile si vous voulez seulement libérer de la ressource, puis renvoyer l'exception - vous n'avez pas besoin d'un gestionnaire de capture gazilion pour chaque exception tapez vous lancez).

Exemple:

class MyException : public std::exception { 
    int x; 
    const char* y; 

public: 
    MyException(const char* msg, int x_, const char* y_) 
     : std::exception(msg) 
     , x(x_) 
     , y(y_) { 
    } 

    int GetX() const { return x; } 
    const char* GetY() const { return y; } 
}; 

... 

try { 
    throw MyException("Shit just hit the fan...", 1234, "Informational string"); 
} catch(MyException& ex) { 
    LogAndShowMessage(ex.what()); 
    DoSomething(ex.GetX(), ex.GetY()); 
} 
+2

"utile si vous voulez seulement libérer de la ressource, puis renvoyer l'exception" Dans ce cas, vous devriez juste faire 'catch (...) {/ * ... */throw; } '. De plus, 'std :: exception' n'a pas de constructeur qui prend un argument. (Bien que je sache que VS en a un de toute façon.) – GManNickG

+0

Le problème avec catch (...) est qu'il (sur la plate-forme Windows au moins) piège aussi les exceptions structurées déclenchées par le système quand il y a un mauvais accès à la mémoire, . J'ai été étonné quand une partie de mon code ne plante pas le programme. J'ai eu un attrapé (...) entourant la chaîne d'appel, et il a piégé l'accès au pointeur NULL. Je suis un peu méfiant de discuter avec n'importe quelle déclaration si l'état du processus est dans un état inconnu. –

Questions connexes