私はC++を初めて使用していて、おそらく明らかに何かが不足しています。 OCTとHEXの数値をDECに変換したい。私はあらゆる種類の間違った入力を得ることができるので、多くの条件の代わりにstd :: stoulで変換を行い、失敗したときにキャッチしたかったのです。C++で失敗した後にStd :: stoulがキャッチされない
メソッドのポイントは、文字列内に3つの数字を取得することです。最初はOCT、DECは2番目、3番目はHEXです。彼らが同じ価値を持っているかどうかを確認する必要があります。
文字列のベクトルvecから数値が得られますが、問題なく動作していますが、問題はないと思います。
問題が発生すると、メソッドが失敗するたびに(たとえば、OCTの場合は「88」)、テスト全体が失敗し、catchブロックには入りません。
これは私のコードです:
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;
}
これらは、この方法のための私のテストの例です。最初は大丈夫です。残りはキャッチブロックで終わるはずです。
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"));
}
}
ほとんどの場合、エラーは、少なくともあなたがそれを期待しているコードにあります。とにかく[mcve]を提供する必要があります。どのような予言も投げられない/キャッチされていることをどのように知っていますか? – user463035818
私はテスト方法を持っています。だから、悪い入力を伴うテストが来ると、それはcatchブロックに入るのではなく、std:stoulの行で失敗します。 –
私が書いたように、例えばOCTの場合、私はオクサン番号ではない "88"を送ります。そうすれば失敗するはずですが、実際には例外はありません。またはHEXの場合は、「2x」のような形式で送信できます。そんなものが私が取り除こうとしているものです。 –