【发布时间】:2019-04-01 18:00:53
【问题描述】:
在下面的代码中,我想处理 5 个可能由用户输入创建的不同异常。
我知道我应该使用IF 语句来处理这些异常,但要求 是使用异常处理程序来处理错误。所以请我只是在寻找这样做的输入,而不是替代方案。
我想用异常处理程序来处理它们。
我遇到的问题是在哪里放置异常处理代码。
另外,我有 5 个要检查的异常是否意味着我需要 5 个不同的 try/catch 块,或者我可以在同一个块中处理它们吗?
我正在寻找的例外是,尝试创建超过 19 个帐户,尝试创建初始余额低于 $300 的帐户,从帐户中提取超过当前余额,尝试在帐户上进行交易尚未创建并在TextBox 中输入除数字以外的任何内容。
因此,如果用户犯了这些错误之一,我想抛出错误并向用户显示他们所犯错误的消息。
非常感谢任何帮助。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MoreRobustBankGUI
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private int _nextIndex = 0;
List<Account> accounts = new List<Account>();
decimal balance = 0;
private void createButton1_Click(object sender, EventArgs e)
{
if (accounts.Count < 19 && balance > 300)
{
_nextIndex++;
int accountId = _nextIndex;
decimal.TryParse(amountTextBox2.Text, out balance);
transactionLabel3.Text = "Account: #" + accountId + " created with a starting balance of $" + balance;
accountTextBox1.Text = "" + accountId;
accounts.Add(new Account(balance)
{
AccountId = accountId
});
}
else
{
transactionLabel3.Text = "Can only create up to 19 accounts and starting balance must be $300";
}
}
private void executeButton2_Click(object sender, EventArgs e)
{
decimal amount = 0;
int accountID;
string textAmount = amountTextBox2.Text == "" ? "0" : amountTextBox2.Text;
if (depositRadioButton3.Checked == true)
{
if (string.IsNullOrEmpty(accountTextBox1.Text)) return;
bool accountCanBeConverted = int.TryParse(accountTextBox1?.Text, out accountID);
bool ammountCanBeConverted = decimal.TryParse(amountTextBox2?.Text, out amount);
if (accountCanBeConverted && ammountCanBeConverted && amount > 0)
{
var selectedAccount = GetAccount(accountID);
selectedAccount.DepositFunds(amount);
transactionLabel3.Text = $"Account: #{selectedAccount.AccountId} You made a deposit of ${amount}";
}
}
else if (withdrawRadioButton2.Checked == true)
{
if (string.IsNullOrEmpty(accountTextBox1.Text)) return;
bool accountCanBeConverted = int.TryParse(accountTextBox1?.Text, out accountID);
bool ammountCanBeConverted = decimal.TryParse(amountTextBox2?.Text, out amount);
if (accountCanBeConverted && ammountCanBeConverted && amount > 0)
{
var selectedAccount = GetAccount(accountID);
if (selectedAccount.HasAvailableFunds)
{
selectedAccount.WithdrawFromAccount(amount);
transactionLabel3.Text = $"Account: #{selectedAccount.AccountId} You made a withdrawal of ${amount}";
}
else
{
transactionLabel3.Text = $"Account: #{selectedAccount.AccountId} Does not have available funds to withdraw";
}
}
}
else if (balanceRadioButton3.Checked == true)
{
if (string.IsNullOrEmpty(accountTextBox1.Text)) return;
bool accountCanBeConverted = int.TryParse(accountTextBox1?.Text, out accountID);
var selectedAccount = GetAccount(accountID);
var balance = selectedAccount.GetAvailableBalanceForAccount(accountID);
if (balance == -1234567890)
{
transactionLabel3.Text = $"Invalid account number passed.";
}
else
{
transactionLabel3.Text = $"Account: #{selectedAccount.AccountId} Balance: $ {selectedAccount.GetAvailableBalanceForAccount(accountID)}";
}
}
clearFields();
}
public void clearFields()
{
amountTextBox2.Text = "";
}
public Account GetAccount(int id)
{
return accounts.Where(x => x.AccountId == id).FirstOrDefault();
}
public class Account
{
public Account(decimal balance)
{
Balance = balance;
}
public int AccountId { get; set; }
public decimal Balance { get; set; }
public void WithdrawFromAccount(decimal deductionAmount)
{
Balance -= deductionAmount;
}
public void DepositFunds(decimal depositAmount)
{
Balance += depositAmount;
}
public bool HasAvailableFunds => Balance > 0;
public decimal GetAvailableBalanceForAccount(int accountId)
{
if (accountId == AccountId)
{
return Balance;
}
else
{
return -1234567890;
}
}
}
}
}
【问题讨论】:
-
您只能处理抛出的异常。您所指的这 5 个异常(ArgumentException、InvalidOperationException 等)的类型是什么,它们是在哪里抛出的?还是您可能是想问“我如何从/在我的代码中抛出自定义异常”?
-
是的,我在帖子中提到了例外情况,但他们又来了。我正在寻找的例外情况是,尝试创建一个初始余额低于 300 美元的帐户,尝试创建超过 19 个帐户,从帐户中提取超过当前余额,尝试在尚未创建的帐户上进行交易并在文本框中输入除数字以外的任何内容。所以是的,我需要尝试一下,然后在创建时抛出错误,最后向用户发送一条消息,说明他们犯了什么错误。
-
您可能希望在这里了解更多关于如何处理(捕获)异常以及如何创建用户定义的异常的信息:docs.microsoft.com/en-us/dotnet/standard/exceptions 这有望为您提供足够的知识来实现您的目标.
-
好的,谢谢。我会看看它是否对我有帮助。
标签: c# winforms error-handling