如何将抛出的异常从C#类传递给C#表单

时间:2012-06-22 04:19:29

标签: c# error-handling try-catch rethrow

我在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;
        }
    }

但是,尝试上述操作时,不会将错误传递给Form。它只是崩溃程序说没有处理异常。

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

我做错了什么? 谢谢

3 个答案:

答案 0 :(得分:2)

这只是意味着抛出了既不属于 InvalidTransactionAmtNegativeException 也不属于 AccountInactiveException 的异常。添加新的捕获块

catch (Exception ex) {
    throw;
}
编辑:你应该把它放在最后。它将捕获可能在DoTransaction方法中抛出的任何其他异常

答案 1 :(得分: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();
        }
    }

答案 2 :(得分:0)

看起来您的异常不属于您在catch块中给出的特定异常。所以最后抓住一般异常。这是一个很好的做法。