Namespaces
Variants

std::experimental:: scope_fail

From cppreference.net

Défini dans l'en-tête <experimental/scope>
template < class EF >
class scope_fail ;
(library fundamentals TS v3)

Le modèle de classe scope_fail est un garde de portée à usage général conçu pour appeler sa fonction de sortie lorsqu'une portée est quittée via une exception.

scope_fail n'est pas CopyConstructible , CopyAssignable ou MoveAssignable , cependant, il peut être MoveConstructible si EF satisfait certaines exigences, ce qui permet d'encapsuler un scope_fail dans un autre objet.

Un scope_fail peut être soit actif, c'est-à-dire qu'il appelle sa fonction de sortie lors de la destruction, soit inactif, c'est-à-dire qu'il ne fait rien lors de la destruction. Un scope_fail est actif après avoir été construit à partir d'une fonction de sortie.

Un scope_fail peut devenir inactif en appelant release() sur celui-ci manuellement ou automatiquement (par le constructeur de déplacement). Un scope_fail inactif peut également être obtenu en l'initialisant avec un autre scope_fail inactif. Une fois qu'un scope_fail est inactif, il ne peut plus redevenir actif.

Un scope_fail contient effectivement un EF et un indicateur bool indiquant s'il est actif, ainsi qu'un compteur d'exceptions non capturées utilisé pour détecter si le destructeur est appelé lors du déroulement de pile.

Table des matières

Paramètres du modèle

EF - type de fonction de sortie stockée
Exigences de type
-
EF doit être soit :
-
L'appel d'une lvalue de std:: remove_reference_t < EF > sans argument doit être bien formé.

Fonctions membres

construit un nouveau scope_fail
(fonction membre publique)
appelle la fonction de sortie lorsque la portée est quittée via une exception si le scope_fail est actif, puis détruit le scope_fail
(fonction membre publique)
operator=
[deleted]
scope_fail n'est pas assignable
(fonction membre publique)
Modificateurs
rend le scope_fail inactif
(fonction membre publique)

Guides de déduction

Notes

La construction d'un scope_fail de durée de stockage dynamique peut entraîner un comportement inattendu.

La construction d'un scope_fail à partir d'un autre scope_fail créé dans un thread différent peut également conduire à un comportement inattendu, car le nombre d'exceptions non capturées obtenu dans différents threads peut être comparé lors de la destruction.

Exemple

#include <iostream>
#include <cstdlib>
#include <string_view>
#include <experimental/scope>
void print_exit_status(std::string_view name, bool exit_status, bool did_throw) {
  std::cout << name << ":\n";
  std::cout << "  Throwed exception  " << (did_throw ? "yes" : "no") << "\n";
  std::cout << "  Exit status        " << (exit_status ? "finished" : "pending") << "\n\n";
}
// Randomly throw an exception (50% chance)
void maybe_throw() {
    if (std::rand() >= RAND_MAX / 2)
        throw std::exception{};
}
int main() {
  bool exit_status{false}, did_throw{false};
  // Manual handling at "end of scope"
  try {
    maybe_throw();
    exit_status = true; 
  } catch (...) { did_throw = true; }
  print_exit_status("Manual handling", exit_status, did_throw);
  // Using scope_exit: runs on scope exit (success or exception)
  exit_status = did_throw = false;
  try {
    auto guard = std::experimental::scope_exit{[&]{ exit_status = true; } };
    maybe_throw();
  } catch (...) { did_throw = true; }
  print_exit_status("scope_exit", exit_status, did_throw);
  // Using scope_fail: runs only if an exception occurs
  exit_status = did_throw = false;
  try {
    auto guard = std::experimental::scope_fail{[&]{ exit_status = true; } };
    maybe_throw();
  } catch (...) { did_throw = true; }
  print_exit_status("scope_fail", exit_status, did_throw);
  // Using scope_success: runs only if no exception occurs
  exit_status = did_throw = false;
  try {
    auto guard = std::experimental::scope_success{[&]{ exit_status = true; } };
    maybe_throw();
  } catch (...) { did_throw = true; }
  print_exit_status("scope_success", exit_status, did_throw);
}

Sortie :

Manual handling:
  Throwed exception  yes
  Exit status        pending
scope_exit:
  Throwed exception  no
  Exit status        finished
scope_fail:
  Throwed exception  yes
  Exit status        finished
scope_success:
  Throwed exception  yes
  Exit status        pending

Voir aussi

encapsule un objet fonction et l'invoque en quittant la portée
(modèle de classe)
encapsule un objet fonction et l'invoque en quittant la portée normalement
(modèle de classe)
suppresseur par défaut pour unique_ptr
(modèle de classe)