如何将抛出的异常从C#类传递到C#表单
我在c#中有一个项目,分为UI层和业务层。 基本上,我有一个表格,你可以选择一个帐户并输入一个存款号码。单击“确定”按钮后,您的DepositTransaction.cs将处理该交易 以下是存款单的示例代码:如何将抛出的异常从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
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,它起作用了。实际上,刚刚抛出;也起作用了,只是我处理存款的方式不同。将在几分钟后更新问题。我的存款交易实际上有点不同,因为它涉及一个计时器。因此,我认为检查负数的方法是实现对实际表单本身的检查。