4

我构建了一个自定义异常,用于在我正在从事的学校项目中捕获不同的错误。

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

问题是当我在下面的 switch 语句的默认子句中使用 "throw WrongValueException("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 语句中列出的运算符之一,如果不是我想抛出异常。当抛出异常时,我得到的只是一个字符,该字符根据输入中给出的字符而变化。

我在主函数中发现了错误。

输入输出示例如下:

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

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

“按任意键继续...”上方的单个字符是操作员更改时更改的内容。我已经成功地为我在程序中进行的一些其他检查实现了这个错误捕获,并且抛出冒泡到主要的 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中,您将 a 添加char到 aconst char *中。这执行指针添加而不是字符串连接,因为std::string不涉及。

将其中一个操作数转换为string第一个:

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