Ich bin neu in C++ und wahrscheinlich fehlt etwas offensichtlich. Ich möchte OCT- und HEX-Nummern mit DEC in Verbindung bringen. Ich kann alle Arten von falschen Eingaben bekommen, also wollte ich anstelle vieler Bedingungen die Konvertierung mit std :: stoul machen und fangen, wenn es nicht funktioniert.Std :: stoul nicht nach Caching in C++ gefangen
Der Punkt der Methode besteht darin, 3 Zahlen in einer Zeichenfolge zu erhalten. Der erste ist in OCT, der zweite in DEC und der dritte in HEX. Ich muss überprüfen, ob sie den gleichen Wert haben oder nicht.
Ich bekomme die Zahlen von einem Vektor Vec von Strings, aber das funktioniert gut und ich glaube nicht, das Problem ist da.
Problem ist, dass immer wenn die Methode fehlschlägt (zum Beispiel "88" für OCT) der gesamte Test fehlschlägt und es nicht in den catch-Block geht.
Dies ist mein Code:
bool validate_line(const std::string& str) {
std::vector<std::string> vec;
std::string tmp;
for (int i = 0; i < str.size(); i++){
if(str.at(i) == ' '){
vec.push_back(tmp);
tmp = "";
}
else {
tmp += str.at(i);
if(i + 1 == str.size()) vec.push_back(tmp);
}
}
if(vec.size() != 3) return false;
//1 - Octan number
unsigned long octDec;
try {
octDec = std::stoul(vec.at(1), nullptr, 8);
}
catch(const std::invalid_argument& ia){
return false;
}
//2 - Decimal
int dec = atoi(vec.at(2).c_str());
//3 - Hex number
std::string h = vec.at(3).c_str();
unsigned long hexDec;
try{
hexDec = std::stoul(h, nullptr, 16);
}
catch(const std::invalid_argument& ia) {
return false;
}
if(octDec == dec && dec == hexDec) return true;
return false;
}
Dies sind Beispiele für meine Tests für diese Methode. Der erste ist in Ordnung. Der Rest sollte in den Catch-Blöcken enden.
TEST_CASE("Line validation", "[small1]") {
GIVEN("complex improperly tagged equal string") {
CHECK(validate_line("0111 73 0x49"));
}
GIVEN("string not conforming to format -- bad number format") {
CHECK(!validate_line("88 88 0x58"));
}
GIVEN("string not conforming to format -- not numbers") {
CHECK(!validate_line("07 7 G"));
}
}
die meiste Zeit ist der Fehler in dem Code, wo Sie es am wenigsten erwarten. Wie auch immer, du musst ein [mcve] bereitstellen. Woher weißt du, dass keine Exception geworfen/gefangen wird? – user463035818
Ich habe eine Testmethode. Wann immer also ein Test mit einer schlechten Eingabe kommt, scheitert es an der Zeile mit std: stoul, anstatt in den catch-Block zu gehen. –
Wie ich geschrieben habe, zum Beispiel für OCT, sende ich "88" ein, was nicht die Oktanzahl ist. Dann sollte es scheitern und es tut es tatsächlich, aber es ist keine Ausnahme. Oder für HEX kann ich etwas wie "2x" einsenden. So etwas versuche ich loszuwerden. –