Classe d'Exception avec un char* constructeur
Je suis tombé sur le code suivant sur VS2008
if (!CreateProcess( NULL,
const_cast<LPWSTR>(ss.str().c_str()),
NULL,
NULL,
FALSE,
CREATE_NO_WINDOW|NORMAL_PRIORITY_CLASS,
NULL,
NULL,
&si,
&pi))
{
throw std::exception("Unable to format Device");
}
Maintenant, je suis portage du code de mingw gcc et je reçois le message d'erreur
error: no matching function for call to 'std::exception::exception(const char [23])'
Enquêter sur la question, j'ai remarqué que Visual Studio dispose d'un fichier d'exception qui, lui, prévoit une exception de la classe et de ne prendre en char*. Certaines des définitions ressembler à ceci
__CLR_OR_THIS_CALL exception();
__CLR_OR_THIS_CALL exception(const char *const&);
__CLR_OR_THIS_CALL exception(const char *const&, int);
__CLR_OR_THIS_CALL exception(const exception&);
exception& __CLR_OR_THIS_CALL operator=(const exception&);
virtual __CLR_OR_THIS_CALL ~exception();
virtual const char * __CLR_OR_THIS_CALL what() const;
Ma question est comment dois-je contourner ce build question sur mingw gcc ? Dois-je créer une nouvelle classe qui hérite de std::runtime_error et jeter cette place ?
std::exception::exception(const char*)
n'est pas un standard c++, plutôt un MS spécifiques de mise en oeuvre en.cppreference.com/w/cpp/error/exception/exceptionOriginalL'auteur James Franco | 2015-02-21
Vous devez vous connecter pour publier un commentaire.
Opinion joue un rôle ici. Le problème est que
std::exception
n'a pas un constructeur qui prend un argument de type chaîne; c'est un MSVC extension. Je vois deux façons d'aller à ce sujet:std::exception
Le premier cas est simple; il suffit d'utiliser
L'inconvénient est que vous ne recevez pas un message d'erreur descriptif.
Si le message d'erreur est important, à l'aide de
std::exception
directement n'est pas une option. Dans ce cas, vous pouvez utiliser soitstd::logic_error
oustd::runtime_error
, qui héritentstd::exception
, et ont, les constructeurs prenant un argument de type chaîne, de sortepeut déjà résoudre le problème.
catch
clauses qui a attiré l'std::exception
sera aussi attraper lastd::runtime_error
. Il y a un problème potentiel, mais:catch
clauses catchstd::runtime_error
n'aurait pas pris lastd::exception
mais va attraper cette.Cela semble ressembler un peu à un cas de coin, et il est tout à fait possible qu'il n'est pas un problème pour vous. Si, toutefois, il est possible que le long de la pile des appels, il est un
catch
clause qui attirestd::runtime_error
mais il ne doit pas intercepter l'exception levée par ce code, vous pouvez tirer votre propre classe d'exception destd::exception
qui prend un argument de type chaîne. Parce que la classe est nouveau, il ne sera pas pris par lescatch
clauses. Par exemple:Et puis
Ce n'est sans doute pas très jolie, et il est peu probable qu'il est nécessaire, de sorte que le plus probable solution est d'utiliser
std::runtime_error
oustd::logic_error
(ou d'une classe dérivée de l'un d'eux).Si
std::logic_error
oustd::runtime_error
est le plus approprié est pas très clair, dans ce cas, je serais probablement aller avecstd::runtime_error
parce que l'erreur ne semble pas encore théoriquement prévisible, mais étant donné questd::domain_error
etstd::future_error
dériver destd::logic_error
, il ne serait pas entièrement sa place dans cette hiérarchie. C'est, je pense, une question d'opinion.OriginalL'auteur Wintermute