Maison  >  Article  >  développement back-end  >  Quand devriez-vous utiliser `__try` et `__sauf` au lieu de `try` et `catch` en C ?

Quand devriez-vous utiliser `__try` et `__sauf` au lieu de `try` et `catch` en C ?

DDD
DDDoriginal
2024-11-07 22:22:03373parcourir

When Should You Use `__try` and `__except` Instead of `try` and `catch` in C  ?

__try et try/catch/finally en C

En C , la gestion des exceptions est principalement réalisée via les blocs try/catch/finally. Cependant, il existe des commandes moins connues qui commencent par des traits de soulignement doubles, comme __try. Cet article vise à clarifier quand ces traits de soulignement sont nécessaires.

Sur les systèmes Windows, les exceptions sont prises en charge via la gestion structurée des exceptions (SEH), un mécanisme au niveau du système d'exploitation. Les compilateurs utilisent généralement cette infrastructure SEH pour la mise en œuvre des exceptions C. Les mots-clés throw et catch gèrent uniquement les exceptions C, leur code d'exception SEH correspondant étant 0xe06d7363.

Pour gérer les exceptions SEH, les programmes C nécessitent l'utilisation du mot-clé non standard __try. De plus, __sauf est similaire à catch mais permet de spécifier un filtre d'exception pour déterminer si une exception active doit être gérée. __finally permet l'exécution de code après la gestion des exceptions.

Pour illustrer ces concepts, considérons l'exemple de programme ci-dessous :

#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;
}

void testProcessorFault() {
    Example e;
    int* p = 0;
    *p = 42;
}

void testCppException() {
    Example e;
    throw 42;
}

int main()
{
    __try {
        testProcessorFault();
    }
    __except(filterException(GetExceptionCode(), GetExceptionInformation())) {
        std::cout << "caught" << std::endl;
    }
    __try {
        testCppException();
    }
    __except(filterException(GetExceptionCode(), GetExceptionInformation())) {
        std::cout << "caught" << std::endl;
    }
    return 0;
}

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