【发布时间】: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