【问题标题】:How to pass a thrown exception from a C# class to a C# Form如何将抛出的异常从 C# 类传递到 C# 窗体
【发布时间】:2012-06-24 09:25:43
【问题描述】:

我有一个 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:,并且该错误将被传递给调用这个类的类(在我的例子中是表单),它将被处理在表格中。

我做错了什么? 谢谢

【问题讨论】:

  • 尝试'抛出新的 InvalidTransactionAmtNegativeException(message);'设置错误信息。
  • 您应该发布异常的堆栈跟踪
  • DoTransaction 可能会引发您在 buttonOK_Click 中未捕获的异常。您应该添加一个 catch(Exception ex) 来捕获所有可能的异常(除非您在其他地方有最后机会处理程序)。顺便说一句,DoTransaction 末尾的 catch 子句完全是多余的。
  • 谢谢 Prasanth,它成功了。其实只是扔;也有效,只是我处理存款的方式不同。将在几分钟内更新问题
  • 我的 DepositTransaction 实际上有点不同,因为它涉及一个计时器。因此,我认为检查负数的唯一方法是将检查落实到实际表单本身。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      catch (Exception ex) {
          throw;
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-17
        • 2016-02-29
        • 2012-01-18
        • 1970-01-01
        • 2021-11-18
        • 1970-01-01
        相关资源
        最近更新 更多