Question

En C++, je suis en train d'essayer d'attraper tous les types d'exceptions dans un piège (comme catch(Exception) en C#).Comment est-il fait?Et en plus, comment peut-on attraper une division par zéro exceptions?

Était-ce utile?

La solution

catch (...)
{
   // Handle exceptions not covered.
}

Considérations importantes:

  • Une meilleure approche est d'attraper des types spécifiques d'exception que vous pouvez récupérer à partir de, par opposition à toutes les exceptions possibles.
  • catch(...) permettra aussi de détecter un certain sérieux niveau du système d'exceptions (il varie en fonction du compilateur) que vous n'allez pas être en mesure de récupérer de façon fiable à partir.La capture de cette façon et puis de la déglutition et continue pourrait causer d'autres problèmes graves dans votre programme.
  • En fonction de votre contexte, il peut être acceptable d'utiliser des captures(...), en fournissant l'exception sera levée.Dans ce cas, vous devez vous connecter tous utiles informations d'état, et puis re-lancer l'exception de l'autoriser à se propager vers le haut.Cependant, vous devriez lire sur les RAII modèle si vous choisissez cette voie.

Autres conseils

Vous ne pas voulez être à l'aide de catch (...) (c'est à direattraper avec les points de suspension), à moins que vous vraiment, vraiment, la plupart des prouvable en avons besoin.

La raison pour cela est que certains compilateurs (Visual C++ 6 le nom de la plus commune) également activer les erreurs comme la segmentation des défauts et d'autres très mauvaises conditions dans les exceptions que vous pouvez volontiers la poignée à l'aide de catch (...).C'est très mauvais, parce que vous ne voyez pas le bloque plus.

Et techniquement, oui, vous pouvez également prendre de division par zéro (vous aurez à "StackOverflow" pour ça), mais vous devriez vraiment être en évitant de faire de ces divisions, en premier lieu.

Au lieu de cela, procédez de la manière suivante:

  • Si vous savez vraiment ce genre d'exception(s) à attendre, à attraper les types et pas plus, et
  • Si vous avez besoin de lancer des exceptions à vous-même, et devez attraper toutes les exceptions de vous lancer, faire de ces exceptions dérivent de std::exception (comme Adam Pierce suggéré) et des captures qu'.

Si vous êtes sur windows et la nécessité de gérer les erreurs comme la division par zéro et la violation d'accès vous pouvez utiliser une exception structurée traducteur.Et puis à l'intérieur de votre traducteur, vous pouvez jeter une des exceptions c++:

void myTranslator(unsigned code, EXCEPTION_POINTERS*)
{
    throw std::exception(<appropriate string here>);
}

_set_se_translator(myTranslator);

Remarque, le code va vous dire ce que l'erreur a été.Aussi, vous devez compiler avec l'option de /EHa (C/C++ -> Code Generatrion -> Activer le C/C++ Exceptions = Oui avec SEH Exceptions).

Si cela ne fait pas sens la caisse de la documentation pour [_set_se_translator](http://msdn.microsoft.com/en-us/library/5z4bw5h5(SV.80).aspx)

Si attraper toutes les exceptions, y compris l'OS est vraiment ce dont vous avez besoin, vous avez besoin de prendre un coup d'oeil à votre compilateur et de l'OS.Par exemple, sur Windows, vous avez probablement "__essayer" mot-clé ou commutateur de compilateur pour faire "try/catch" catch SEH exceptions, ou les deux.

Faites tous vos exception personnalisée classes héritent de std::exception, alors vous pouvez simplement attraper std::exception.Voici un exemple de code:

class WidgetError
    : public std::exception
{
public:
    WidgetError()
    { }

    virtual ~WidgetError() throw()
    { }

    virtual const char *what() const throw()
    {
        return "You got you a widget error!";
    }
};

En C++, la norme ne définit pas une division par zéro exception, et les mises en œuvre ont tendance à ne pas les jeter.

Vous pouvez, bien sûr, utiliser les catch (...) { /* code here */ }, mais cela Dépend vraiment de Ce que Vous Voulez Faire.En C++, vous avez déterministe destructeurs (aucun des que la finalisation des ordures), donc si vous voulez éponger la bonne chose à faire est d'utiliser RAII.

Par exemple.au lieu de:

void myfunc()
{
    void* h = get_handle_that_must_be_released();
    try { random_func(h); }
    catch (...) { release_object(h); throw; }
    release_object(h);

}

Faire quelque chose comme:

#include<boost/shared_ptr.hpp>

void my_func()
{
    boost::shared_ptr<void> h(get_handle_that_must_be_released(), release_object);
    random_func(h.get());
}

Créez votre propre classe avec un destructeur si vous n'utilisez pas de coup de pouce.

Si je me souviens bien (ça fait un moment depuis que j'ai regardé, C++), je pense que la suite devrait faire l'affaire

try
{
 // some code
}
catch(...)
{
 // catch anything
}

et un rapide google(http://www.oreillynet.com/pub/a/network/2003/05/05/cpluspocketref.html) semble prouver me corriger.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top