我在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:
并且该错误将被传递给调用此类的类(在我的情况下是表单),它将会以表格处理。
我做错了什么? 谢谢
答案 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块中给出的特定异常。所以最后抓住一般异常。这是一个很好的做法。