[C++] 284 FLTK : ChatGPTアプリの製作 その13 パースエラーの捕捉 try-catch文

[M1 Mac, Monterey 12.6.3, clang 13.0.0, FLTK 1.3.8, ChatGPT Plus, NO IDE]

jsonデータのパースエラーを捕捉するtry-catch文をメモ書きしておきます。

    try{
        resJson = json::parse(res);
    }
    catch (const json::parse_error& e) {
        std::cerr << "Parse error:\n" << e.what() << std::endl;

        Fl_Text_Buffer* bufferError = new Fl_Text_Buffer();
        bufferError -> text(e.what());
        noticeDisplay->buffer(bufferError);
        noticeDisplay -> wrap_mode(Fl_Text_Display::WRAP_AT_BOUNDS, 5);

        return;
    }
    catch (const char* error) {
        cerr << "Error: " << error << endl;

        Fl_Text_Buffer* bufferError = new Fl_Text_Buffer();
        bufferError -> text(error);
        noticeDisplay->buffer(bufferError);
        noticeDisplay -> wrap_mode(Fl_Text_Display::WRAP_AT_BOUNDS, 5);

        return;
    }
    catch (...){
        cerr << "その他のError" << endl;

        const char* error = "その他のError";
        Fl_Text_Buffer* bufferError = new Fl_Text_Buffer();
        bufferError -> text(error);
        noticeDisplay->buffer(bufferError);
        noticeDisplay -> wrap_mode(Fl_Text_Display::WRAP_AT_BOUNDS, 5);

        return;
    }

[C++] 283 FLTK : ChatGPTアプリの製作 その12 前後の質問表示 

[M1 Mac, Monterey 12.6.3, clang 13.0.0, FLTK 1.3.8, ChatGPT Plus, NO IDE]

一連の質問についてボタンで前後移動できるようにしました。

質問回数表示で数値がダブって描画されるというトラブルが発生しましたが、window -> redraw();で解決しました。

あとはGUI左下の回答内コード表示が出来れば完成です。

アプリが落ちないよう例外処理を随時追加していきます。

void backCB(Fl_Widget*, void*){
    questionNumShow -> value("");
    window -> redraw();

    // jsonDataからuserとassistantのcontentを取り出し表示
    if (arrowCount == 0){
        currentCount = countQ - 2;

        if(currentCount < 0){
            currentCount = 0;
        }

        arrowCount++;
    } else {
        if (currentCount > 0){
            currentCount--;
        }
    }

    cout << "currentCount: " << currentCount << endl;

    // jsonData確認
    string jsonDataString = jsonData.dump(2);
    cout << "jsonDataString:\n" << jsonDataString << endl;

    auto messages = jsonData["messages"];

    int i = 0;
    for (auto message : messages) {
        // roleがuserの場合はcontentを出力
        if (message["role"] == "user") {
            // cout << "user: " << message["content"] << endl;
            if (i == currentCount){
                cout << "user: " << message["content"] << endl;
                input -> value(message["content"].get<string>().c_str());
            }
            i++;
        }
    }

    i = 0;
    for (auto message : messages) {
        // roleがassistantの場合はcontentを出力
        if (message["role"] == "assistant") {
            // cout << "assistant: " << message["content"] << endl;
            if (i == currentCount){
                cout << "assistant: " << message["content"] << endl;

                Fl_Text_Buffer* buffer = new Fl_Text_Buffer();
                buffer -> text(message["content"].get<string>().c_str());
                output -> buffer(buffer);
            }
            i++;
        }
    }

    // 質問回数表示
    string countStr =  to_string(currentCount + 1) + " / " + to_string(countQ);
    cout << "countStr: " << countStr << endl;
    questionNumShow -> value(countStr.c_str());
}