C# 尝试使用窗口窗体应用程序捕获语句

C# 尝试使用窗口窗体应用程序捕获语句,c#,C#,我的目标是,如果有人试图将余额降至零以下,则抛出NegativeBalanceException。就像这是一个真实的银行账户。我有if和else语句,但把它们都杀掉了,我试图学习try、catch和throw语句(我也在最后阅读,但我认为这不适用于这里)。不管怎样,如果我只按存款按钮而不键入任何内容,我就设置了catch语句的工作方式。但是,我不明白它想让我在哪里实现它,因为它把它降到了零以下。这是我的存款方式吗?还是在实际的btn_存款中?另外,使用try-catch语句而不是if-else语

我的目标是,如果有人试图将余额降至零以下,则抛出NegativeBalanceException。就像这是一个真实的银行账户。我有if和else语句,但把它们都杀掉了,我试图学习try、catch和throw语句(我也在最后阅读,但我认为这不适用于这里)。不管怎样,如果我只按存款按钮而不键入任何内容,我就设置了catch语句的工作方式。但是,我不明白它想让我在哪里实现它,因为它把它降到了零以下。这是我的存款方式吗?还是在实际的btn_存款中?另外,使用try-catch语句而不是if-else语句的目的是什么?我是编程新手,我只是在努力学习

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    public class BankAccount
    {
        decimal amount = 300.00m;
        // Declare Delegate Type Object
        public delegate void BankDelegate(decimal oldBalance, decimal newBalance);
        // Create Delegate Type Events 
        public event BankDelegate OnDeposit;
        public event BankDelegate OnWithdraw;

        public void Deposit(decimal a)
        {
            {
                if (a > 0)
                {
                OnDeposit(this.amount, this.amount + a);
                this.amount += a;
                }
                else
                {
                    MessageBox.Show("No!");
                }
            }
        }
        public void Withdraw(decimal a)
        {
            // Fire OnWithdraw Event and pass old and new balance amount
            OnWithdraw(this.amount, this.amount - a);
            this.amount -= a;
        }
    }
    // Declare BankAccount class variable 
    BankAccount account = null;
    private void Form1_Load(object sender, EventArgs e)
    {
        account = new BankAccount();
        // Attach Event Handlers with Events     
        account.OnDeposit += new BankAccount.BankDelegate(account_OnDeposit);
        account.OnWithdraw += new BankAccount.BankDelegate(account_OnWithdraw);
    }
    private void btnDeposit_Click(object sender, EventArgs e)
    {
        try
        {
                account.Deposit(Convert.ToDecimal(textBox1.Text));
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
    private void btnWIthdraw_Click(object sender, EventArgs e)
    {
        account.Withdraw(Convert.ToDecimal(textBox1.Text));
    }
    void account_OnDeposit(decimal oldBalance, decimal newBalance)
    {
        label4.Text = oldBalance.ToString();
        label5.Text = newBalance.ToString();
    }
    void account_OnWithdraw(decimal oldBalance, decimal newBalance)
    {
        label4.Text = oldBalance.ToString();
        label5.Text = newBalance.ToString();
    }
}

}

您应该只在异常情况下抛出异常。透支账户并非例外情况。。但如果存款金额为负数,则是错误的

因此,对于
存款
方法,我会这样做:

public void Deposit(decimal a)
{
    if (a < 1)
        throw new NegativeDepositException("You cannot deposit this amount");

    OnDeposit(this.amount, this.amount + a);
    this.amount += a;
}
此外,我会将
draw
更改为return
bool
,因为透支实际上不是一种例外情况:

public bool Withdraw(decimal a) 
{
    if (this.amount - a >= 0)
    {
        // Fire OnWithdraw Event and pass old and new balance amount
        OnWithdraw(this.amount, this.amount - a);
        this.amount -= a;
        return true; // successful
    }
    else
    {
        return false; // unsuccessful
    }
}
那么当你叫它:

private void btnWIthdraw_Click(object sender, EventArgs e)
{
    if (!account.Withdraw(Convert.ToDecimal(textBox1.Text)))
    {
        MessageBox.Show("Insufficient funds");
    }
}
编辑:


回应你的评论。如果希望以特定的方式命名异常类(或者希望它扩展普通异常的功能),则必须创建自己的异常类。在我的示例中,您必须创建以下内容:

public class NegativeDepositException : Exception {
}

就这样。它从
异常
获取所需的一切。。现在。

它说找不到“NegativedPositionException”。我假设我需要在我的系统中添加一些东西。在顶端?我可能完全错了。另外,真正使用这些工具的目的是什么?我一直使用if/else,直到我开始看到最复杂的程序使用这个?自学这一点很困难。您必须创建自己的异常类,该异常类继承自
exception
。我将更新我的帖子,向你展示这一点。还有,我说过的例外。。用于在特殊情况下在应用程序中创建错误。如果错误不是异常的。。不要抛出异常。用if/else来代替。什么将某事物划分为例外和非例外?这更像是某人的个人观点?这个案例有什么分类标准吗?这些标准是你所在领域所期望的。您的域名是否预计人们会存入负余额?哦,不。如果你现在去银行要求存款负50美元,他们会笑的。。这是一个例外的要求。现在,如果你要求提取50美元。。那完全不同。如果你的银行允许透支账户。。那么,当人们的账户中只有50美元时,他们完全有可能被允许提取60美元。这是意料之中的。。这不是一个特殊的要求。明白。非常感谢你,先生!与实际问题无关,但与域相关:帐户是活动的实际帐户,而不是单个数字。使用交易清单,而不是更新的单一余额。我强烈建议阅读。你可以打赌,你会得到一个关于异常的非常好的答案,因为Eric Lippert是C#编译器团队的主要开发人员。
public class NegativeDepositException : Exception {
}