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.
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.
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; }
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 : 🎜rrreeeCe 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!