2009-05-15 3 views
1

In C++, was ist der Unterschied zwischen den folgenden Beispielen?Erneutes Auswerfen der Exception durch Zeiger

Re-throw Zeiger:

catch (CException* ex) 
{ 
    throw ex; 
} 

Einfacher Wiederwurf:

catch (CException* ex) 
{ 
    throw; 
} 

Wenn der Wiederwurf gefangen wird, wird das Stack-Trace anders sein?

+1

Als eine Randnotiz, es sei denn, erzwungen von Bibliotheken, ist es besser, nicht durch Zeiger zu fangen http://www.parashift.com/c++-faq-lite/exceptions.html#faq-17.6 –

Antwort

7

Ja. Im Grunde werfen Sie das Objekt im ersten Fall selbst. Es sieht so aus, als hätten Sie die Ausnahme selbst in der Zeile throw ex generiert. Im zweiten Fall lässt man das ursprüngliche Objekt einfach im Call-Stack nach oben gehen (und bewahrt damit den ursprünglichen Call-Stack), diese sind unterschiedlich. Normalerweise sollten Sie throw; verwenden.

-2

Ich denke, es gibt einen Leistungsunterschied. Die zweite Version erstellt keine temporäre Kopie der Ausnahme. Der erste wird eine Kopie erstellen, daher ist der zweite der Weg zu gehen.

Sie können eine einfache Ausnahmeklasse erstellen und es ausprobieren. Lassen Sie den Konstruktor/Kopie-Konstruktor bei der Ausgabe auf die Konsole drucken. Auf diese Weise sollten Sie den Unterschied sehen.

+0

Eine Kopie wird nicht sein im ersten Fall konstruiert, weil der Zeiger geworfen wird. –

+0

Ich lese es, als er sagte, dass der Zeiger kopiert wird. Und fragte sich, warum er das für einen Leistungsunterschied hielt. Jetzt sehe ich, woran er gedacht hat. Ja, es ist falsch, nur der Zeiger wird kopiert und die Kopie kann entfernt werden. –

Verwandte Themen