noexcept obwohl Exceptions entstehen können?
-
Hiho,
ich habe eine Funktion vorliegen, die komplett
noexceptist, ausser einemstd::mutex::lock-Aufruf. Ich kann beweisen, dass die betroffene Mutex nicht bereits vom selben Thread gelockt wurde, was ja zu einem Deadlock führen wrüde. Der Standard erwähnt in [thread.mutex.requirements.mutex] 13.2 als zweite Error Condition neben dem Deadlocking noch:operation_not_permitted — if the thread does not have the privilege to perform the operation.
Soviel ich weiss, habe ich keine Kontrolle darüber.
Ist es daher O.K., meine ganze Funktion als
noexceptzu klassifizieren? Wennstd::mutex::lockdoch wirft, kann ich ohnehin nichts dagegen unternehmen und eine Termination wäre das einzig Sinnvolle.
Ist dies auch sonst gängige Praxis - nicht behebbare Fehler innoexceptzu packen, weil sie während der korrekten Ausführung des Programms nicht werfen - oder habe ich das Konzept missverstanden?Liebe Grüsse
-
Ja.
If your function may not throw, declare it noexcept
aber
don't just sprinkle noexcept all over the place without considering whether the possible exceptions can be handled.
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Rf-noexcept
Insbesondere solltest du dir überlegen, ob nicht jemand anderes deinen Code verwenden könnte und die Exception fangen will.
Das Detail mit dem Stack-Unwinding (kann, muss nicht passieren bei einemthrowinnoexcept(true)) ist dir vermutlich bekannt?