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

如何将抛出的异常从C#类传递到C#表单,c#,error-handling,try-catch,rethrow,C#,Error Handling,Try Catch,Rethrow,我在c#中有一个项目,分为UI层和业务层。 基本上,我有一个表格,你可以选择一个帐户并输入一个存款号码。单击“确定”按钮后,您的DepositTransaction.cs将处理该交易 以下是存款单的示例代码: private void buttonOK_Click(object sender, EventArgs e) { try { bool inputTest; decimal amount; input

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

以下是存款单的示例代码:

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();
        }
    }
现在是存款交易的示例代码

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;
        }
    }
public override void DoTransaction(){
试一试{

if(Amount表示抛出的异常类型既不是InvalidTransactionMTNegativeException也不是AccountInactiveException。添加新的catch块

catch (Exception ex) {
    throw;
}

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

如果您在UI中的所有捕获块中重复代码,只需使用通用捕获块:

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();
        }
    }

您的异常似乎不在catch块中给定的特定异常之下。因此,在最后捕获泛型异常。这是一个很好的做法。

尝试“抛出新的InvalidTransactionMTNegativeException(消息)”设置错误消息。您应该发布ExceptionToTransaction的堆栈跟踪。按钮OK_Click中可能会抛出一个未捕获的异常。您应该添加一个捕获(exception ex)来捕获所有可能的异常(除非您在别处有最后一个处理程序)。顺便说一句,DotTransaction结尾的catch子句是完全多余的。谢谢你,Prasanth,它起作用了。实际上,刚刚抛出;也起作用了,只是我处理存款的方式不同。将在几分钟后更新问题。我的存款交易实际上有点不同,因为它涉及一个计时器。因此,我认为检查负数的方法是实现对实际表单本身的检查。