4

取り組んでいる学校のプロジェクト全体でさまざまなエラーをキャッチするために使用しているカスタム例外が作成されています。

class WrongValueException : public std::runtime_error
{
public:
    WrongValueException(std::string mess): std::runtime_error(mess) {};
};

問題は、以下のswitchステートメントのデフォルト句で「throwWrongValueException( "Error:Syntax");」を使用した場合です。

Expression* SubExpression::parse()
{
    Expression* left;
    Expression* right;
    char operation, paren;

    left = Operand::parse();
    cin >> operation;
    right = Operand::parse();
    cin >> paren;
    switch (operation)
    {
        case '+':
            return new Plus(left, right);
        case '-':
            return new Minus(left, right);
        case '*':
            return new Times(left, right);
        case '/':
            return new Divide(left, right);
        default:
            throw WrongValueException("Error: Syntax - " + operation);
    }
    return 0;
}

基本的に、swtichステートメントに渡される文字は、例外をスローしたくない場合は、swtichステートメントにリストされている演算子の1つである必要があります。例外がスローされた場合、入力で指定された文字に基づいて変化する単一の文字だけが取得されます。

main関数でエラーをキャッチします。

入力と出力の例は次のとおりです。

Enter expression: (5^x),x=2;
#
Press any key to continue . . .

Enter expression: (5&x),x=2;
T
Press any key to continue . . .

「続行するには任意のキーを押してください...」の上の1文字は、オペレーターが変わると変わるものです。プログラムにある他のいくつかのチェックでこのエラーキャッチを正常に実装しました。スローは問題なくメインのtry/catch句までバブルします。これが唯一のものです。

4

2 に答える 2

6

文字列リテラルで+を使用しないでください。それはあなたが思っているものとは異なった振る舞いをします。最初に文字列にキャストする必要があります

throw WrongValueException(std::string("Error: Syntax - ") + operation);

それ以外の場合は、オフセットがの数値に等しい文字のアドレスを渡しますoperation"Hello"+1へのポインタ'e'です。あなたの場合、あなたは範囲外に出て、本質的に未定義の振る舞いをしています。

于 2013-03-09T19:43:55.607 に答える
3

"Error: Syntax - " + operation、にを追加しcharていconst char *ます。これは、関与しないため、文字列連結の代わりにポインタの追加を実行します。std::string

stringオペランドの1つを最初にキャストします。

std::string("Error: Syntax - ") + operation
于 2013-03-09T19:45:20.423 に答える