noexcept obwohl Exceptions entstehen können?



  • Hiho,

    ich habe eine Funktion vorliegen, die komplett noexcept ist, ausser einem std::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? Wenn std::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 in noexcept 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 einem throw in noexcept(true) ) ist dir vermutlich bekannt?


Anmelden zum Antworten