【问题标题】:throw does not show error msg c++ [closed]throw 不显示错误消息 c++ [关闭]
【发布时间】:2017-03-25 20:37:24
【问题描述】:

最终更新:感谢所有 cmets 和帮助。我回到教科书并复制了整个代码来运行他们的程序,并意识到他们的抛出消息从未出现过,我认为会出现消息,这就是为什么我希望在我的程序上出现一条消息,这就是为什么我没有使用尝试/捕获。再次感谢您的帮助。

我正在处理一项任务,由于某种原因,throw invalid_argument 不会显示消息“帐户余额太低”。

我几乎从我的教科书中获取了代码

void setBaseSalary(double salary) {
  if (salary<0.0){
    throw invalid_argument("Salary must be >= 0.0");
   }
}

并创建了我自己的....

void Account::setAccountBalance(double accountBalanceVar)
{
    cout << accountBalanceVar << "B4 IF" << endl;
    if (accountBalanceVar < 0.0) {
        cout << accountBalanceVar << "B4 while in IF" << endl; 
        throw invalid_argument("Account balance is too low"); // program err      
        accountBalanceVar = 0.0;
        cout << accountBalanceVar << "In IF" << endl;
    }
    accountBalance = accountBalanceVar;
}

cout 是我调试程序停止工作的地方,这导致我投掷。

这是我复制错误的完整代码,我使用 -5 作为输入

#include <iostream>
#include <iomanip>
#include "savingAccount.h"
#include "checkingAccount.h"
#include "Account.h"

// header

using namespace std;

int main() {

    double userAccountBalance{ 0.0 };

    cout << "Enter your account Balance: " << endl;
    cin >> userAccountBalance;

    Account myAccount{ userAccountBalance };

    return 0;
}

#include "Account.h"
#include <iostream>
#include <iomanip>
#include <string>
#include <stdexcept>
#include <sstream>

using namespace std;



Account::Account(double accountBalanceVar) {

    setAccountBalance(accountBalanceVar);
    cout << accountBalance << ": Tester: constructor" << endl;
}

double Account::credit(double addBalance)
{
    accountBalance+=addBalance;

    return accountBalance;
}

double Account::debit(double withDrawnVar)
{
    if (accountBalance < withDrawnVar) {

        cout << "Error : You can not withdrawn more than your total balance";
        withDrawnVar = 0; // To ensure unchange

}
    accountBalance -= withDrawnVar;

    return withDrawnVar;
}

Account::~Account()
{
}

void Account::setAccountBalance(double accountBalanceVar)
{
    cout << accountBalanceVar << "B4 IF" << endl;
    if (accountBalanceVar < 0.0) {
        cout << accountBalanceVar << "B4 while in IF" << endl;
        throw invalid_argument("Account balance must be >= 0.0");
        accountBalanceVar = 0.0;
        cout << accountBalanceVar << "In IF" << endl;
    }
    accountBalance = accountBalanceVar;

}

double Account::getAccountBalance()
{
    return accountBalance;
}


#include <iostream>
#include <iomanip>
#include <string>

#ifndef ACCOUNT_H
#define ACCOUNT_H 
class Account
{
public:
    Account(double = 0.0);
    double credit(double);
    double debit(double);


    ~Account();


    void setAccountBalance(double);
    double getAccountBalance();

private:
    double accountBalance{ 0.0 };
    double zeroBalance{ 0.0 };

};

#endif

更新:

你看到了什么症状?你使用什么输入? 输入后程序停止(使用-5作为输入) " cout

命令显示-5,不显示throw,程序停止。

我没有使用 try/catch,因为教科书的示例没有使用它,我很困惑为什么教科书版本有效而​​我的无效..它几乎相同。


【问题讨论】:

  • 您必须提供更多详细信息。你是什​​么意思“抛出 invalid_argument 不想工作”?你看到什么症状?你使用什么输入?调用函数的代码是什么样的?
  • 在哪里处理异常?你的try...catch 声明在哪里?
  • 您是否希望在throw 之后看到cout 打印的文本?该程序永远不会到达那里。可以给我们一个minimal reproducible example,以便我们有足够的信息来提供好的建议吗?
  • 谁说异常参数总是打印出来的?你没有抓到吗?
  • 对这个问题的正确关闭投票犹豫不决:不清楚你在问什么或离题(缺少重现错误的代码)

标签: c++ throw invalid-argument


【解决方案1】:

异常由 try/catch 语句处理。您需要添加一个才能捕获您的异常并打印其值。

try {
  Account myAccount{ -5.0 }; // Assuming this calls setAccountBalance
} catch (const std::invalid_argument &e) {
  std::cerr << "Exception: " << e.what() << std::endl;
}

如果您从未捕获到异常,则会调用 terminate 函数。它将停止您的可执行文件。 C++ 不像 Java,因为它不会打印未处理的异常。如果您在 Linux 上运行并启用了核心文件生成,则会生成一个核心文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多