Maison  >  Article  >  développement back-end  >  Comment diviser la hiérarchie des exceptions dans la gestion des exceptions des fonctions C++ ?

Comment diviser la hiérarchie des exceptions dans la gestion des exceptions des fonctions C++ ?

WBOY
WBOYoriginal
2024-04-15 18:48:021041parcourir

La hiérarchie des exceptions en C++ fournit différents niveaux d'héritage de classes d'exception pour classer les situations d'exception. Cette hiérarchie est ancrée dans la classe std::exception et comprend des exceptions de base, des exceptions d'exécution et des exceptions logiques. Des classes d'exceptions plus spécifiques sont dérivées de ces classes de base. Grâce au mécanisme de gestion des exceptions, les exceptions à différents niveaux peuvent être détectées et les mesures correspondantes prises si nécessaire.

C++ 函数异常处理中的异常层级如何划分?

Hiérarchie des exceptions dans la gestion des exceptions des fonctions C++

En C++, la gestion des exceptions des fonctions peut signaler des exceptions en lançant des objets d'exception. Afin de classer différentes situations d'exception, C++ introduit la hiérarchie des exceptions. La hiérarchie des exceptions est une hiérarchie d'héritage de classes d'exceptions définies par la bibliothèque standard qui fournit différents niveaux d'informations pour les objets d'exception.

1. Hiérarchie d'héritage des classes d'exception

La hiérarchie des exceptions est la hiérarchie d'héritage avec la classe std::exception comme racine : std::exception 类为根的继承层次结构:

class std::exception {
public:
    virtual ~exception() noexcept = default;
    virtual const char* what() const noexcept = 0;
};

// 基本异常类
class std::runtime_error : public std::exception {
public:
    runtime_error(const char* whatArg) : whatArg_(whatArg) {}
    virtual const char* what() const noexcept override { return whatArg_; }

private:
    const char* whatArg_;
};

// 派生异常类
class std::logic_error : public std::runtime_error {
public:
    logic_error(const char* whatArg) : runtime_error(whatArg) {}
};

2. 异常层级划分

异常层级将异常类分为不同的级别:

  • 基础异常 (std::exception):表示所有异常情况的基类。
  • 运行时异常 (std::runtime_error):表示在程序运行时发生的异常,例如内存分配失败或文件打开失败。
  • 逻辑异常 (std::logic_error):表示程序逻辑中的错误,例如非法参数或无效状态。

更具体的异常类从 std::runtime_errorstd::logic_error 衍生,例如:

  • std::bad_alloc:内存分配失败。
  • std::invalid_argument:无效参数。
  • std::range_error:范围错误(例如,数组下标越界)。

3. 实战案例

考虑以下函数:

int divide(int numerator, int denominator) {
    if (denominator == 0) {
        throw std::invalid_argument("denominator cannot be zero");
    }
    return numerator / denominator;
}

denominator 为 0 时,此函数抛出 std::invalid_argument 异常。该异常属于 std::logic_error 层级,表示程序逻辑中一个无效的参数错误。

在调用 divide 函数时,你可以使用异常处理机制来捕获异常:

try {
    int result = divide(10, 2);
    std::cout << "Result: " << result << std::endl;
} catch (const std::invalid_argument& e) {
    std::cerr << "Error: " << e.what() << std::endl;
}

在这种情况下,当 denominator 为 0 时,将捕获 std::invalid_argumentrrreee

🎜2. hiérarchie Divisez les classes d'exception en différents niveaux : 🎜
  • 🎜Basic exception (std::exception)🎜 : La classe de base représentant toutes les situations d'exception.
  • 🎜Exception d'exécution (std::runtime_error)🎜 : indique une exception qui se produit lorsque le programme est en cours d'exécution, telle qu'un échec d'allocation de mémoire ou un échec d'ouverture de fichier.
  • 🎜Exception logique (std::logic_error)🎜 : indique des erreurs dans la logique du programme, telles que des paramètres illégaux ou un statut non valide.
🎜Des classes d'exceptions plus spécifiques sont dérivées de std::runtime_error et std::logic_error, par exemple : 🎜
  • std::bad_alloc : l'allocation de mémoire a échoué.
  • std::invalid_argument : paramètre non valide.
  • std::range_error : erreur de plage (par exemple, indice du tableau hors limites).
🎜🎜3. Cas pratique 🎜🎜🎜Considérez la fonction suivante : 🎜rrreee🎜Lorsque denominator est 0, cette fonction renvoie std::invalid_argument code >Exception. Cette exception appartient au niveau <code>std::logic_error et représente une erreur de paramètre non valide dans la logique du programme. 🎜🎜Lors de l'appel de la fonction divide, vous pouvez utiliser le mécanisme de gestion des exceptions pour intercepter les exceptions : 🎜rrreee🎜Dans ce cas, lorsque le dénominateur est 0, il interceptera std::invalid_argument lève une exception et imprime un message d'erreur. 🎜

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