2008-09-29 6 views

Répondre

29

La seconde. Voici ma tentative de citer Sutter

« Throw par valeur, prise par référence »

Apprenez à catch correctement: Jeter des exceptions par valeur (pointeur non) et les captures par référence (généralement à const) . C'est la combinaison qui s'intègre le mieux avec la sémantique d'exception. Lors de la réitération de la même exception , préférez simplement throw; à throw e;.

Voici le plein Item 73. Throw by value, catch by reference.


La raison pour éviter d'attraper des exceptions par valeur est qu'elle fait implicitement une copie de l'exception. Si l'exception est d'une sous-classe, alors les informations à ce sujet seront perdues.

try { throw MyException ("error") } 
catch (Exception e) { 
    /* Implies: Exception e (MyException ("error")) */ 
    /* e is an instance of Exception, but not MyException */ 
} 

La capture par référence évite ce problème en ne copiant pas l'exception.

try { throw MyException ("error") } 
catch (Exception& e) { 
    /* Implies: Exception &e = MyException ("error"); */ 
    /* e is an instance of MyException */ 
} 
+0

voulez-vous dire le premier? –

+0

Doug T: Pas la seconde. Attraper par référence. –

+0

Un peu plus de détails dans la réponse serait bien. Laissez le lien pour les détails exacts mais mettez en détails (et l'exemple) sur la méthode la plus acceptée. –

3

Certainement la seconde. Si vous aviez les éléments suivants:

class my_exception : public exception 
{ 
    int my_exception_data; 
}; 

void foo() 
{ 
    throw my_exception; 
} 

void bar() 
{ 
    try 
    { 
    foo(); 
    } 
    catch (exception e) 
    { 
    // e is "sliced off" - you lose the "my_exception-ness" of the exception object 
    } 
} 
+0

Je crois que le but de la question était de savoir s'il fallait attraper par référence ou par valeur, et non s'il fallait attraper une version de la classe de base de l'exception. –

+1

Le problème de tranchage est l'une des principales raisons pour lesquelles vous devriez toujours attraper par référence –

+0

Je vois maintenant ce que vous voulez dire - si e était pris par référence dans votre exemple, le polymorphisme se déclencherait de manière appropriée. –

6

Notez également que, lorsque vous utilisez MFC, vous pouvez avoir à catch by pointer. Sinon, la réponse de @ JaredPar est la façon dont vous devriez normalement aller (et j'espère ne jamais avoir à faire face à des choses qui jettent un pointeur).

11

Personnellement, je pencherais pour la troisième option:

catch (const _com_error& e) 
+0

Oui, si possible, il devrait être const. – Miquella