noexcept obwohl Exceptions entstehen können?
-
Hiho,
ich habe eine Funktion vorliegen, die komplett
noexcept
ist, 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
noexcept
zu klassifizieren? Wennstd::mutex::lock
doch 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 innoexcept
zu 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 einemthrow
innoexcept(true)
) ist dir vermutlich bekannt?