Maison  >  Article  >  développement back-end  >  Quand et pourquoi devriez-vous utiliser le mot-clé __try en C ?

Quand et pourquoi devriez-vous utiliser le mot-clé __try en C ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-06 13:16:02718parcourir

When and Why Should You Utilize the __try Keyword in C  ?

C Try/Catch/Finally Blocks et le mot-clé __try

Structured Exception Handling (SEH) est le mécanisme de gestion des exceptions au niveau du système d'exploitation. pris en charge par Windows. Les compilateurs pour Windows utilisent généralement SEH pour implémenter les exceptions C.

Alors que les mots-clés C throw et catch gèrent exclusivement les exceptions C, le compilateur Microsoft Visual C (MSVC) fournit des mots-clés __try et __sauf non standard pour gérer les exceptions SEH.

Bloc __try :

Le bloc __try non standard définit la portée dans laquelle une exception peut se produire, tout comme un bloc try en C . Il est suivi des blocs __sauf et __finally.

__sauf Bloc :

Le bloc __sauf est similaire à un bloc catch en C mais offre plus de flexibilité. Il possède une expression de filtre d'exception qui évalue si une exception active doit être gérée.

Bloc __finally :

Le bloc __finally contient du code qui s'exécute après toute gestion d'exception. C'est similaire à un bloc enfin en C#, mais pas directement équivalent en C standard.

Cas d'utilisation des blocs __try :

Les exceptions SEH peuvent inclure celles générées par le fonctionnement système, code interopérable utilisant SEH ou code géré utilisant le code d'exception ".NET". Pour détecter ces exceptions en C, les blocs __try doivent être utilisés avec les blocs __sauf.

Exemple de programme :

L'exemple de programme montre les exceptions SEH et comment les destructeurs C peuvent être appelé pendant le déroulement de l'exception SEH.

#include <windows.h>
#include <iostream>

class Example {
public:
  ~Example() { std::cout << "destructed" << std::endl; }
};

int filterException(int code, PEXCEPTION_POINTERS ex) {
  std::cout << "Filtering " << std::hex << code << std::endl;
  return EXCEPTION_EXECUTE_HANDLER;
}

int main() {
  __try {
    Example e;
    int* p = 0;
    *p = 42;  // intentially generating a processor fault
  } __except (filterException(GetExceptionCode(), GetExceptionInformation())) {
    std::cout << "caught" << std::endl;
  }

  return 0;
}

Sortie :

Filtering c0000005
destructed
caught

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