Gooi nieuwe std :: uitzondering vs gooi std :: uitzondering

Tijdens het kijken naar een code, struikelde ik op:

throw /*-->*/new std::exception ("//...

en ik dacht altijd dat u niet nodig hebt / u mag niet gebruiken newHIER.
Wat is de juiste manier, zijn beide OK, zo ja, dan is er een verschil?

BTW van wat ik kan zien terwijl “gripping” met PowerShell Boost-libs nooit gebruikt throw new.

P.S. Ook vond ik een CLI-code die gebruik maakt van throw gcnewgooien. Is dat ok?


Antwoord 1, Autoriteit 100%

De conventionele manier om uitzonderingen te gooien en vangst is om een ​​uitzonderingsobject te gooien en om het door verwijzing te vangen (meestal constreferentie). De C++ -taal vereist de compiler om de juiste code te genereren om het uitzonderingsobject te construeren en het op de juiste manier op de juiste tijd op te ruimen.

Gooien van een aanwijzer naar een dynamisch toegewezen object is nooit een goed idee. Uitzonderingen worden verondersteld om u in staat te stellen meer robuuste code in het aangezicht van de foutcondities te schrijven. Als u een uitzonderingsobject op de conventionele manier gooit, kunt u er zeker van zijn of deze wordt vastgelegd door een catch-clausule die het juiste type benoemt, door een catch (...), of het dan is gegooid of niet het zal op het juiste moment correct worden vernietigd. (Het enige uitzondering is als het helemaal nooit wordt betrapt, maar dit is een niet-herstelbare situatie, wat er ook naar kijkt.)

Als u een aanwijzer naar een dynamisch toegewezen object gooit, moet u er zeker van zijn dat, ongeacht de oproepstapel eruit ziet op het punt dat u uw uitzondering wilt gooien. Er is een vangstblok dat het juiste wijzertype noemt en de juiste deleteOproep. Uw uitzondering mag nooit worden betrapt door catch (...)Tenzij dat blok de uitzondering opnieuw gooit die wordt verstrikt door een ander vangstblok dat correct is met de uitzondering.

Dit betekent effectief, dit betekent dat u de functie uitzondering behandelt die het gemakkelijker moet maken om een ​​robuuste code te schrijven en het erg moeilijk te maken om code te schrijven die in alle situaties correct is. Dit laat het probleem opzij dat het bijna onmogelijk zal zijn om op te treden als bibliotheekcode voor clientcode die deze functie niet verwacht.


Antwoord 2, Autoriteit 35%

Niet nodig om newte gebruiken bij het gooien van uitzondering.

schrijf gewoon:

throw yourexception(yourmessage);

en vang als:

catch(yourexception const & e)
{
      //your code (probably logging related code)
}

Merk op dat yourexceptionzou moeten ontlenen aan std::exceptiondirect of indirect.


Antwoord 3, Autoriteit 24%

Gooien new std::exceptionis correct als de oproepsite verwacht een std::exception*te vangen. Maar niemand zal verwacht een aanwijzer op een uitzondering te vangen. Zelfs als u documenteert, is dat wat uw functie doet en mensen de documentatie lezen, zijn ze nog steeds aansprakelijk om te vergeten en proberen een verwijzing naar een std::exception-object in te halen.


Antwoord 4, Autoriteit 9%

De C++ FAQ heeft hierover een leuke discussie:

  1. https://isocpp.org/wiki/faq/exceptions#wat- to-catch
  2. https://isocpp.org/wiki/faq/ Uitzonderingen # Catch-by-PTR-IN-MFC

In principisch “Tenzij er een goede reden is om niet te volgen, bij de referentie te vangen. Vermijd het vangen van waarde, omdat die ervoor zorgt dat een exemplaar wordt gemaakt en de kopie kan een ander gedrag hebben van wat er werd gegooid. Alleen onder zeer bijzondere omstandigheden moet u vangen door aanwijzer. “


Antwoord 5, Autoriteit 2%

Operator new kan niet garanderen dat er nooit een uitzondering wordt gegenereerd. Om deze reden zou het gebruik ervan voor het genereren van een “geldige” (beoogde) uitzondering een code opleveren waarvan niet kan worden gegarandeerd dat deze niet crasht. Aangezien er slechts één uitzondering tegelijk kan zijn en uw programma er twee probeert te gooien voordat een van hen kan worden opgevangen, is het beste wat een implementatie kan doen, uw programma onmiddellijk af te breken, b.v. door std::terminate te bellen.

Other episodes