2017-10-24 8 views
1

私は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")); 
    } 
} 
+1

ほとんどの場合、エラーは、少なくともあなたがそれを期待しているコードにあります。とにかく[mcve]を提供する必要があります。どのような予言も投げられない/キャッチされていることをどのように知っていますか? – user463035818

+0

私はテスト方法を持っています。だから、悪い入力を伴うテストが来ると、それはcatchブロックに入るのではなく、std:stoulの行で失敗します。 –

+0

私が書いたように、例えばOCTの場合、私はオクサン番号ではない "88"を送ります。そうすれば失敗するはずですが、実際には例外はありません。またはHEXの場合は、「2x」のような形式で送信できます。そんなものが私が取り除こうとしているものです。 –

答えて

2

あなたのコードは常に次の行で返します。

if(vec.size() != 4) return false; 

ので、投げることができる関数が呼び出されることはありません。

その時点のvec.size()は、すべてのテスト入力に対して常に3です。

UPDATE:この答えはすでに投稿された後

OPは

if(vec.size() != 3) return false; 

に問題のコードの行を変更しました。

+0

申し訳ありませんが、これは私が示したコードの誤ったタイプです。それは本当の問題ではありません。私は元の投稿でそれを修正しました。 –

+0

有効な回答がある場合(元の質問に)、質問を変更しないでください。 * UPDATE:*セクション – cwschmidt

0

問題は実際にコンパイラにありました。私はCLionを使用し、デバッグ時にはreturn文だけがあればcatchブロックへのステップを表示しません。実際にコードに問題はありません。

+0

TomášZajdaもしあなたがしたいなら、あなたは私の答えを受け入れられたものにすることができます。 – cwschmidt

関連する問題