-1

私が作成したワークアウト トラッカー プログラムに例外処理を実装しようとしていますが、現在はエラー チェックがありません。リンクされたリストと一連の関数を処理するExlistクラスがあります。例外処理を追加するときに必要ないくつかの重要な関数があります。

  • リストをテキスト ファイルに更新する
  • リストを日付で並べ替える
  • ワークアウトの編集(キーでリストを検索)
  • ワークアウトの削除(キーでリストを検索して削除)
  • ワークアウトを追加

クラス内の関数から例外をスローし、それらを int でキャッチするにはどうすればよいですかmain()。同じブロックでの単純な例外処理は知っていますが、これを解決するための解決策を思いつくことができないようです。私の理想的な状況は

//in int main, when the user selects add
try
{
    WorkoutList.addEx();
} 
//other code...
//catch at end of loop and display error
catch(string error)
{
    cout << "Error in: addEx..." << error << endl;
}
4

1 に答える 1

2

Exceptionから継承する例外クラスを作成する必要があります。たとえば、間違った値が追加されたときにそれをスローしたい場合は、次のようにすることができます。

#include <stdexcept>
class WrongValueException : public std::runtime_error
{
    public:
        WrongValueException(string mess): std::runtime_error(mess) {}
};

次に、addEx()関数でそれをスローします

//SomeCode
if(value.isWrong()){
    throw WrongValueException("Wrong Value");
} else {
    //add
}

そして、メインでそれをキャッチします:

int main(){
    //SomeCode
    try
    {
         WorkoutList.addEx();
    } 
    //other code...
    //catch at end of loop and display error
    catch(WrongValueException const& ex)
    {
        std::cerr << "WrongValueException: " << ex.what() << std::endl;
    }
    catch(std::exception const& ex)
    {
        std::cerr << "std::exception: " << ex.what() << std::endl;
        throw;
    }
    catch(...)
    {
        std::cerr << "Unknown Exception: " << ex.what() << std::endl;
        throw;
    }

スローされた例外は、スローした場所からキャッチされるまでバブルします。キャッチされない場合、プログラムは終了します(スタックを巻き戻さずに終了する可能性があります(したがって、再スローした場合でも、メインで例外を常にキャッチする(スタックを強制的に巻き戻すため)のが通常は最善です)。

于 2012-12-12T22:33:58.133 に答える