2

私はC++の初心者であり、線形方程式の「m」と「b」を計算する単純なコンソールプログラムを作成しようとしています...ユーザーが提供する入力doubleを解析するために、文字列ストリームを使用し、tryを使用しています-誤った入力をチェックするためのcatchブロック。catchブロックにグローバル例外がある場合でも、永続的なエラーが発生し続けます[Equation Solver.exeの0x74c8b9bcで未処理の例外:Microsoft C ++例外:メモリ位置0x00000000で[再スロー]。]

double XOne;`enter code here`
double YOne;
double XTwo;
double YTwo;
bool inputCheck = false;
while (inputCheck == false)
{
    Clear();
    WriteLine("**Linear Equation**");
    Write("X1: ");
    string xone = ReadLine();
    Write("Y1: ");
    string yone = ReadLine();
    Write("X2: ");
    string xtwo = ReadLine();
    Write("Y2: ");
    string ytwo = ReadLine();
    try
    {
        stringstream s1(xone);
        if (s1 >> XOne) { s1 >> XOne; } else { throw; }
        stringstream s2(yone); // consider I give an invalid input for this variable
        if (s2 >> YOne) { s2 >> YOne; } else { throw; } // this doesn't solve the problem
        stringstream s3(xtwo);
        if (s3 >> XTwo) { s3 >> XTwo; } else { throw; }
        stringstream s4(ytwo);
        if (s4 >> YTwo) { s4 >> YTwo; } else { throw; }
    }
    catch (...) { WriteLine("Invalid Input"); ReadLine(); }
}

LinearEquation equation;
equation.Initialize(XOne, YOne, XTwo, YTwo);
stringstream s5;
s5 << equation.m;
string m = s5.str();
stringstream s6;
s6 << equation.b;
string b = s6.str();
Write("Y = ");
Write(m);
Write("X + ");
WriteLine(b);
ReadLine();

編集 最初の提案は魅力のように機能しました...ありがとう!これは、レビュー担当者によると、変更した後のコードです。

double XOne;
double YOne;
double XTwo;
double YTwo;
bool inputCheck = false;
while (inputCheck == false)
{
    Clear();
    WriteLine("**Linear Equation**");
    Write("X1: ");
    string xone = ReadLine();
    Write("Y1: ");
    string yone = ReadLine();
    Write("X2: ");
    string xtwo = ReadLine();
    Write("Y2: ");
    string ytwo = ReadLine();
    try
    {
        stringstream s1(xone);
        if (s1 >> XOne) { s1 >> XOne; } else { throw runtime_error("Invalid Input"); }
        stringstream s2(yone);
        if (s2 >> YOne) { s2 >> YOne; } else { throw runtime_error("Invalid Input"); }
        stringstream s3(xtwo);
        if (s3 >> XTwo) { s3 >> XTwo; } else { throw runtime_error("Invalid Input"); }
        stringstream s4(ytwo);
        if (s4 >> YTwo) { s4 >> YTwo; } else { throw runtime_error("Invalid Input"); }
    }
    catch (runtime_error e) { WriteLine(e.what()); ReadLine(); }
}

LinearEquation equation;
equation.Initialize(XOne, YOne, XTwo, YTwo);
stringstream s5;
s5 << equation.m;
string m = s5.str();
stringstream s6;
s6 << equation.b;
string b = s6.str();
Write("Y = ");
Write(m);
Write("X + ");
WriteLine(b);
ReadLine();
4

1 に答える 1

14

throw引数なしは、処理されている例外がある場合にのみ使用できます(つまり、catchブロック、またはcatchブロックから直接または間接的に呼び出される関数内)。それ以外の場合は、通常は一部の例外オブジェクトである引数とともにthrowを使用する必要があります。選別。

throw例外が処理されていないときに実行されるstd::terminateと、プログラムを終了するために呼び出されます。

例(後#include <stdexcept>

throw std::runtime_error("Bad input");
于 2012-08-08T20:12:56.440 に答える