2015-08-23 1 views
2

J'ai regardé Mike Acton's talk on Data-Oriented Design and C++. Comme il a déclaré à 8min30sec qu'ils n'utilisent pas d'exceptions, ils ne peuvent pas le forcer à être désactivé sur des bibliothèques tierces. Par conséquent, ils "sandbox autour" de ces bibliothèques.Exceptions de sandboxing (de bibliothèques externes et de std :: lib)

Mes questions sont les suivantes:

1. Qu'est-ce qu'on entend exactement par « sandbox » dans les bibliothèques en utilisant des exceptions, lorsque mon codebase fonctionne avec des exceptions et handicapés comment ça marche et comment dois-je faire cela? (Y at-il des différences sur les plates-formes (Win/Linux/Mac, consoles ou mobiles)

2. Lorsque vous utilisez la bibliothèque standard (qui utilise des exceptions, comme dans new et les alikes) comment je "bac à sable" eux? - ou est-ce le même principe que dans 1.

+0

Il suffit de regarder le reste de la vidéo, il continue en expliquant comment ils n'utilisent pas le tas normal, c'est-à-dire que ce n'est pas nouveau. –

+0

Oui, je sais, mais je vais utiliser la bibliothèque standard, et toutes les implémentations std ne semblent pas supporter les exceptions désactivées – nonsensation

Répondre

0

vous pouvez sandbox l'exception en mettant en cache juste dans un emballage supposons que vous avez:.

  • une bibliothèque tiers T qui n'utilise des exceptions
  • votre demande A qui n'utilise pas d'exceptions.

Vous créez ensuite une enveloppe W (compilé avec exceptions activées) qui termineront T mais attraper toutes les exceptions là où elle existe et, par exemple, remplacer par un code d'erreur, comme ceci:

// this one comes from the original library T that throws exceptions 
void someFunctionInT(); 

// this will be your wrapper around the function above 
int someFunctionInW() 
{ 
    try 
    { 
     someFunctionInT(); 
    } 
    catch (...) 
    { 
     return -1; 
    } 

    return 0; 
} 

Donc, de cette façon, votre wrapper W ne devrait pas jeter d'exception et vous pouvez utiliser en toute sécurité lien contre votre application A.

Évidemment, ceci est juste un exemple simple. Mais vous pouvez faire quelque chose d'un peu "colombophile" une fois en ce moment vous avez déjà "payé" pour la gestion des exceptions. Par exemple, vous pouvez tester l'exception et renvoyer différents codes d'erreur ou préparer un message d'erreur à extraire d'une autre fonction, etc., etc ... à votre créativité. :-)