2017-10-19 37 views
0

Je lis what-is-the-purpose-of-stdexceptionwhat et fait référence à la définition de std::exceptionheredifférents types de std :: exception :: ce qui() autre que const char *

Je dois retourner un int de std::exception::what() comme il est virtual mais je peux Ne pas remplacer par le type de retour. Je roulais ma propre exception classe

class BadLengthException : public std::exception 
{ 
private: 
    int length; 
    const char* to_return; 
public: 
    BadLengthException() = default; 
    BadLengthException(int new_length) : length(new_length) { to_return = new const char(length); } 
    ~BadLengthException() = default; 
    const char* what() const throw() { return to_return; } 

}; 

Comment pourrais-je être en mesure de modifier le type de retour à pur int pour répondre à mes besoins tels que

try 
{ 
} 
catch(BadLengthException bad_length) 
{ 
    std::cout << bad_length.what() <------- Got your int value 
} 

Modifier J'apporté des modifications au code. Les tests montrent qu'il fournit les valeurs correctes. Puis-je améliorer ce que j'ai fait étant donné que je dois toujours retourner un const char*?

class BadLengthException : public std::exception 
{ 
private: 
    const size_t size = 2; 
    char ref_arr[5] = { '1','2','3','4','5' }; 
    int length; 
    char* to_return; 
public: 
    BadLengthException() = default; 
    BadLengthException(int new_length) : length(new_length) 
    { 
     to_return = (char*)malloc(size * sizeof(char)); 
     to_return[0] = ref_arr[length - 1]; 
     to_return[1] = '\0'; 
    } 
    ~BadLengthException() = default; 
    const char* what() const throw() override { return to_return; } 

}; 
+1

Ce n'est pas le cas. Pourquoi ne pas simplement ajouter une méthode supplémentaire? Les intercepteurs de votre exception peuvent alors dire 'bad_length.length()' ou tout autre. – GManNickG

+0

@GManNickG Dans ce problème particulier, je résous, la sortie attendue est limitée à seulement 'std :: exception :: what()' – Mushy

+0

_J'ai besoin d'utiliser quoi parce que je dois utiliser what_ ok –

Répondre

0

Vous ne faites pas cela.

Si vous devez faire ceci:

struct custom_error:std::exception { 
    const char* what() const throw() override final { return str.c_str(); } 
    explicit custom_error(std::string s):str(std::move(s)) {} 
    explicit custom_error(int x):custom_error(std::to_string(x)) {} 
private: 
    std::string str; 
}; 

maintenant nous hébergerons et retourner une description sérialisée de votre int dans un tampon, et retourner un pointeur dans sur demande.

Pour reconvertir:

int main() { 
    try { 
    throw custom_error(34); 
    } catch (std::exception const& ex) { 
    std::stringstream ss(ex.what()); 
    int x; 
    if (ss >> x) { 
     std::cout << "X is " << x << "\n"; 
    } 
    } 
} 

Live example.