2017-07-12 22 views
1

ユーザー入力から作成されたベクトルが降順または昇順のいずれかでソートされていない場合、コードに例外をスローしようとしています。C++例外が期待通りに処理されない

using namespace std; 
#include <iostream> 
#include <vector> 
#include <algorithm> 

int main() { 
vector <int> vec; 

//Let user fill a vector with 12 integers. 
//cout << "Please note that input data should be either increasing or decreasing." << endl; 
int n = 0; 
int size = 0; 
while(size < 12) { 
    cout << "Type integer to add to the vector." << endl; 
    cin >> n; 
    vec.push_back(n); 
    ++size; 
} 

//throw exception if unsorted 
try { 
    if (!((is_sorted(vec.begin(), vec.end())) || (is_sorted(vec.end(), vec.begin())))) { 
     throw "Input was not sorted."; 
    } 
} 
catch(exception &error){ 
    cerr << "Error: " << error.what() << endl; 
} 

}

私はそれがこの問題とは無関係であることをかなり確信しているので、私は、特定の番号を検索し、コードの残りの部分を、含まれていません。ベクトルに埋め込まれたデータが昇順または降順の場合はすべて問題ありませんが、例外をテストすると、「char const * 'Aborted」のインスタンスをスローした後に呼び出されます。私はここで何が起こっているのか分かりません。私は例外を処理しているか、sort()関数を間違って使用していますか?

+1

'begin()'と 'end()'を入れ替えると、後ろに行く間隔がなくなり、空の間隔が得られます。代わりに 'rbegin()'と 'rend()'を使いたいとします。 –

+0

同じブロック内で例外をスローしてキャッチする意味はありません。代わりに単純な 'if'を使うべきです。 – Mattia72

+0

うわー、非常に多くのかっこ!あなたは 'is_sorted'への呼び出しの周りのものを削除することができます - それらは冗長です。そして、 '!(A || B)'は '!A &&!B'と等価です。これはデモガンの定理を適用して、' if'文の中の式の最も外側の対を取り除くことができます。 –

答えて

2

、すべての種類は、スロー可能オブジェクトと捕捉可能ですが、あなただけのstd::exceptionのサブクラスをキャッチされています。あなたのコードに

最高の修正があなたにthrow文を変更することになります。

throw std::runtime_error("Input was not sorted."); 
0

あなたはconst char*ないstd::exceptionを投げています。だから、const char*としてそれをキャッチ:

catch(const char* error) { 
    std::cout << "Error: " << error << "\n"; 
    } 

またはstd::exceptionを投げます。

は多くの型をスローし、多くのブロックがcatchであることを覚えておいてください。呼び出されるのはスローされた例外の型に一致するものです。 C++で

+0

マイナーナイトル。私は 'std :: exception'に文字列などを取得するコンストラクタがあるとは思わない。 – user4581301

関連する問題