0

我有一个 c# 项目,分为 UI 层和业务层。基本上我有一个表格,您可以在其中选择一个帐户并输入一个存款号码。单击确定按钮后,您的 DepositTransaction.cs 将处理交易。

以下是 DepositForm 的示例代码:

private void buttonOK_Click(object sender, EventArgs e) {
        try {
            bool inputTest;
            decimal amount;
            inputTest = decimal.TryParse(textBoxAmount.Text, out amount);
            if (inputTest == false) {
                throw new InvalidTransactionAmtException();
            } else {
                BankAccount account = comboBoxAccount.SelectedItem as BankAccount;
                deposit = new DepositTransaction(account, amount);
                this.DialogResult = DialogResult.OK;
            }
        } catch (InvalidTransactionAmtException ex) {
            errorProviderDeposit.SetError(textBoxAmount, ex.Message);
            textBoxAmount.Select();
            textBoxAmount.SelectAll();
        } catch (InvalidTransactionAmtNegativeException ex) {
            errorProviderDeposit.SetError(textBoxAmount, ex.Message);
            textBoxAmount.Select();
            textBoxAmount.SelectAll();
        } catch (AccountInactiveException ex) {
            errorProviderDeposit.SetError(textBoxAmount, ex.Message);
            textBoxAmount.Select();
            textBoxAmount.SelectAll();
        }
    }

现在是 DepositTransaction 的示例代码

public override void DoTransaction() {
        try {
            if (Amount <= 0) {   //Amount is the amount passed by the form
                throw new InvalidTransactionAmtNegativeException();
            }
            if (acc.Active == false) {    //acc is the account passed by the form
                throw new AccountInactiveException();
            }
            acc.Credit(Amount);
            Summary = string.Format("{0} {1}", Date.ToString("yyyy-MM-dd"), this.TransactionType);
            this.setStatus(TransactionStatus.Complete);
        } catch (InvalidTransactionAmtNegativeException ex) {
            throw;
        } catch (AccountInactiveException ex) {
            throw;
        }
    }

但是,尝试上述方法不会将错误传递给表单。它只是使程序崩溃,说没有处理异常。

我在stackoverflow上看到另一个问题,提到传递错误的方法只是使用throw:,并且该错误将传递给调用此类的类(在我的情况下为表单),并将在表单中处理。

我究竟做错了什么?谢谢

4

3 回答 3

2

它只是意味着抛出了一个既不是InvalidTransactionAmtNegativeException也不是AccountInactiveException类型的异常。添加新的捕获块

catch (Exception ex) {
    throw;
}

编辑:你应该把它放在最后。它将捕获您的 DoTransaction 方法中可能引发的任何其他异常

于 2012-06-22T04:25:02.693 回答
0

您在 UI 中的所有 catch 块中重复代码,只需使用通用的 catch 块:

private void buttonOK_Click(object sender, EventArgs e) {
        try {
            bool inputTest;
            decimal amount;
            inputTest = decimal.TryParse(textBoxAmount.Text, out amount);
            if (inputTest == false) {
                throw new InvalidTransactionAmtException();
            } else {
                BankAccount account = comboBoxAccount.SelectedItem as BankAccount;
                deposit = new DepositTransaction(account, amount);
                deposit.DoTransaction();
                this.DialogResult = DialogResult.OK;
            }
        //catch any type of exception here
        } catch (Exception ex) {
            errorProviderDeposit.SetError(textBoxAmount, ex.Message);
            textBoxAmount.Select();
            textBoxAmount.SelectAll();
        }
    }
于 2012-06-22T04:27:24.503 回答
0

似乎您的异常不属于您在 catch 块中给出的特定异常。所以最后捕获通用异常。这是一个很好的做法。

于 2012-06-22T04:29:00.587 回答