Maison  >  Article  >  développement back-end  >  Explication détaillée des fonctions membres C++ : gestion des erreurs et mécanisme d'exception des méthodes objet

Explication détaillée des fonctions membres C++ : gestion des erreurs et mécanisme d'exception des méthodes objet

WBOY
WBOYoriginal
2024-04-29 13:54:011166parcourir

Les mécanismes de gestion des erreurs dans les fonctions membres C++ incluent des codes d'erreur, des assertions et des mécanismes d'exception. Le code d'erreur renvoie directement la valeur de l'erreur ; l'assertion vérifie l'hypothèse et lève une exception si elle n'est pas vraie ; l'exception capture les erreurs graves et les gère via des blocs try-catch. Dans un cas pratique, la fonction push_back() de la classe Vector lève une exception std::bad_alloc lorsque la capacité est insuffisante. Les utilisateurs peuvent intercepter et gérer l'exception via try-catch.

C++ 成员函数详解:对象方法的错误处理与异常机制

Explication détaillée des fonctions membres C++ : gestion des erreurs et mécanisme d'exception des méthodes objet

Les méthodes objet (fonctions membres) en C++ sont cruciales pour gérer la logique métier complexe et les conditions d'erreur. Cet article explorera en profondeur l'utilisation de mécanismes de gestion des erreurs et d'exceptions dans les fonctions membres, et fournira des cas pratiques à illustrer.

Mécanisme de gestion des erreurs

Code d'erreur

La méthode de gestion des erreurs la plus directe consiste à utiliser des codes d'erreur. Les codes d'erreur peuvent être des nombres entiers ou des valeurs d'énumération personnalisées qui représentent des conditions d'erreur spécifiques. Dans les fonctions membres, vous pouvez renvoyer des codes d'erreur en définissant la variable errno : errno 变量来返回错误码:

int MyFunction() {
  if (... /* 发生错误 */) {
    errno = EINVAL; // 设置错误码为无效参数
    return -1; // 返回错误指示符
  }
  // ... 其它代码
}

断言

断言用于检查程序中的假设条件。如果条件不成立,则抛出一个异常(稍后讨论)。在成员函数中,可以使用 assert() 宏来实现断言:

void MyOtherFunction() {
  assert(ptr != nullptr); // 检查指针是否为 nullptr
  // ... 其它代码
}

异常机制

异常是处理严重错误条件的强大机制。异常可以将执行从发生错误的位置传递到指定的位置。在 C++ 中,异常的语法如下:

try {
  // 可能发生异常的代码
} catch (exceptionType1& e) {
  // 处理 exceptionType1 类型异常
} catch (exceptionType2& e) {
  // 处理 exceptionType2 类型异常
} catch (...) {
  // 处理所有类型异常
}

抛出异常

在成员函数中,可以通过使用 throw 关键字抛出异常。异常可以是标准库中的 std::exception 及其子类,也可以是自定义异常类型:

void MyThrowingFunction() {
  if (... /* 发生严重错误 */) {
    throw std::runtime_error("严重错误!");
  }
  // ... 其它代码
}

捕获异常

可以通过在成员函数的 try-catch 块中捕获异常。捕获的异常对象可以通过引用传递给 catch 子句:

void MyCatchingFunction() {
  try {
    MyThrowingFunction();
  } catch (std::runtime_error& e) {
    // 处理 std::runtime_error 类型的异常
  } catch (...) {
    // 处理所有类型异常
  }
}

实战案例

假设有一个 Vector 类,其中包含一个成员函数 push_back(),该函数将元素添加到向量尾部。如果添加到向量的元素数量超过了预分配的容量,则 push_back() 函数应该抛出 std::bad_alloc 异常。

class Vector {
public:
  void push_back(int element) {
    try {
      // 尝试添加元素
      // 如果容量不足,会抛出 std::bad_alloc 异常
      elements.push_back(element);
    } catch (std::bad_alloc& e) {
      // 捕获并重新抛出 std::bad_alloc 异常
      throw;
    }
  }

private:
  std::vector<int> elements; // 使用标准库的 std::vector 作为底层存储
};

在使用 Vector 类时,可以如下方式捕获 push_back()

int main() {
  Vector v;
  try {
    // 尝试向向量添加过多元素,导致容量不足
    for (int i = 0; i < 1000000; i++) {
      v.push_back(i);
    }
  } catch (std::bad_alloc& e) {
    // 捕获 std::bad_alloc 异常并处理
    std::cout << "错误:容量不足!" << std::endl;
    return 1;
  }
  return 0;
}

Assertions🎜🎜Les assertions sont utilisées pour vérifier les hypothèses dans le programme. Si la condition n’est pas remplie, une exception est levée (discutée plus tard). Dans les fonctions membres, vous pouvez utiliser la macro assert() pour implémenter des assertions : 🎜rrreee🎜Mécanisme d'exception🎜🎜Les exceptions sont un mécanisme puissant pour gérer les conditions d'erreur graves. Les exceptions peuvent transférer l'exécution de l'emplacement où l'erreur s'est produite vers un emplacement spécifié. En C++, la syntaxe des exceptions est la suivante : 🎜rrreee🎜Lance une exception🎜🎜Dans une fonction membre, vous pouvez lever une exception en utilisant le mot-clé throw. Les exceptions peuvent être std::exception et ses sous-classes dans la bibliothèque standard, ou elles peuvent être des types d'exception personnalisés : 🎜rrreee🎜La capture des exceptions🎜🎜peut être effectuée par try-catch dans le membre bloc de fonction pour intercepter l'exception. L'objet d'exception intercepté peut être passé par référence à la clause catch : 🎜rrreee🎜Cas pratique🎜🎜Supposons qu'il existe une classe Vector, qui contient une fonction membre push_back( ), cette fonction ajoute des éléments à la fin du vecteur. La fonction push_back() doit lever une exception std::bad_alloc si le nombre d'éléments ajoutés au vecteur dépasse la capacité pré-alloué. 🎜rrreee🎜Lorsque vous utilisez la classe Vector, vous pouvez capturer l'exception levée par la fonction push_back() comme suit : 🎜rrreee

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn