ตัวอย่างคลาส Bank

คลาส Bank แสดงตัวอย่างการตรวจสอบ Error แล้วทำการ throw แบบต่างๆ

Transaction.cs

using System;

namespace ConsoleApp1
{
    class Transaction
    {
        public decimal Amount { get; }
        public DateTime Date { get; }
        public string Notes { get; }

        public Transaction(decimal amount, DateTime date, string note)
        {
            this.Amount = amount;
            this.Date = date;
            this.Notes = note;
        }
    }
}

BankAccount.cs

using System;
using System.Collections.Generic;

namespace ConsoleApp1
{
    class BankAccount
    {
        public string Number { get; }

        public string Owner { get; set; }
        
        #region BalanceComputation
        public decimal Balance
        {
            get
            {
                decimal balance = 0;
                foreach (var item in allTransactions)
                {
                    balance += item.Amount;
                }

                return balance;
            }
        }
        #endregion

        private static int accountNumberSeed = 1234567890;
        
        #region Constructor
        public BankAccount(string name, decimal initialBalance)
        {
            this.Number = accountNumberSeed.ToString();
            accountNumberSeed++;

            this.Owner = name;
            MakeDeposit(initialBalance, DateTime.Now, "Initial balance");
        }
        #endregion

        #region TransactionDeclaration
        private List<Transaction> allTransactions = new List<Transaction>();
        #endregion

        #region DepositAndWithdrawal
        public void MakeDeposit(decimal amount, DateTime date, string note)
        {
            if (amount <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(amount), "Amount of deposit must be positive");
            }
            var deposit = new Transaction(amount, date, note);
            allTransactions.Add(deposit);
        }

        public void MakeWithdrawal(decimal amount, DateTime date, string note)
        {
            if (amount <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(amount), "Amount of withdrawal must be positive");
            }
            if (Balance - amount < 0)
            {
                throw new InvalidOperationException("Not sufficient funds for this withdrawal");
            }
            var withdrawal = new Transaction(-amount, date, note);
            allTransactions.Add(withdrawal);
        }
        #endregion

        #region History
        public string GetAccountHistory()
        {
            var report = new System.Text.StringBuilder();

            report.AppendLine("Date\t\tAmount\tNote");
            foreach (var item in allTransactions)
            {
                report.AppendLine($"{item.Date.ToShortDateString()}\t{item.Amount}\t{item.Notes}");
            }

            return report.ToString();
        }
        #endregion
    }
}

Program.cs

using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var account = new BankAccount("Jack", 1000);
            Console.WriteLine($"Account {account.Number} was created for {account.Owner} with {account.Balance} balance.");

            account.MakeWithdrawal(500, DateTime.Now, "Rent payment");
            Console.WriteLine("Account Balance : " + account.Balance);
            account.MakeDeposit(100, DateTime.Now, "friend paid me back");
            Console.WriteLine("Account Balance : " + account.Balance);

            Console.WriteLine(account.GetAccountHistory());

            // Test that the initial balances must be positive:
            Console.WriteLine("---Test that the initial balances must be positive:---");
            try
            {
                var invalidAccount = new BankAccount("invalid", -55);
            }
            catch (ArgumentOutOfRangeException e)
            {
                Console.WriteLine("Exception caught creating account with negative balance");
                Console.WriteLine(e.ToString());
            }

            // Test for a negative balance
            Console.WriteLine("---Test for a negative balance---");
            try
            {
                account.MakeWithdrawal(750, DateTime.Now, "Attempt to overdraw");
            }
            catch (InvalidOperationException e)
            {
                Console.WriteLine("Exception caught trying to overdraw");
                Console.WriteLine(e.ToString());
            }
        }
    }
}

ผลการรัน

> dotnet run
Account 1234567890 was created for Jack with 1000 balance.
Account Balance : 500
Account Balance : 600
Date            Amount  Note
6/14/2019       1000    Initial balance
6/14/2019       -500    Rent payment
6/14/2019       100     friend paid me back

---Test that the initial balances must be positive:---
Exception caught creating account with negative balance
System.ArgumentOutOfRangeException: Amount of deposit must be positive
Parameter name: amount
   at ConsoleApp1.BankAccount.MakeDeposit(Decimal amount, DateTime date, String note) in C:\Project\ConsoleApp\ConsoleApp1\BankAccount.cs:line 52
   at ConsoleApp1.BankAccount..ctor(String name, Decimal initialBalance) in C:\Project\ConsoleApp\ConsoleApp1\BankAccount.cs:line 37
   at ConsoleApp1.Program.Main(String[] args) in C:\Project\ConsoleApp\ConsoleApp1\Program.cs:line 23
---Test for a negative balance---
Exception caught trying to overdraw
System.InvalidOperationException: Not sufficient funds for this withdrawal
   at ConsoleApp1.BankAccount.MakeWithdrawal(Decimal amount, DateTime date, String note) in C:\Project\ConsoleApp\ConsoleApp1\BankAccount.cs:line 66
   at ConsoleApp1.Program.Main(String[] args) in C:\Project\ConsoleApp\ConsoleApp1\Program.cs:line 35