1

BankAccount をテストするコードをいくつか書き、それを完成させました (大部分)。目的は、例外をスローして試行/キャッチする方法を学ぼうとすることでした。ほとんどの場合、私はかなりのことを学びました。これは「例外的な」ケースではなく、if/else ステートメントの方が適切だったと思います。私はちょうど例外処理を学ぼうとしています。例外クラスを作成してクラスを拡張し、例外がスローされたときに送信されるエラーの詳細を示す新しいメッセージを含めようとしています。スーパークラスとは何か、またはC#の基本クラスを読んで試してみました。コンパイルして正しく見えますが、何が間違っているのかわかりません。throw new NegativeDepositException のメッセージが表示されない理由を誰かに説明してもらえますか。

私がやりたいことは、MessageBox.Show に文字列を入れる代わりにメッセージをスローすることです。

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 class NegativeBalanceException : Exception { }
        public class NegativeWithdrawException : Exception { }
        public class NegativeDepositException : Exception
        {
            public NegativeDepositException() { } // this  doesn't do what I would like for it to do.
            public NegativeDepositException(string message)
                : base(message) { }
        }
    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)
                throw new NegativeDepositException(); //"type some message here instead of messagebox below");
            OnDeposit(this.amount, this.amount + a);
            this.amount += a;
        }
        public void Withdraw(decimal a)
        {
            if (a < 0)
                throw new NegativeWithdrawException();
            OnWithdraw(this.amount, this.amount - a);
            this.amount -= a;
            if (this.amount < 0)
                throw new NegativeBalanceException();
        }
    }
    // this is my bank class variable...
    BankAccount account = null;
    private void Form1_Load(object sender, EventArgs e)
    {
      account = new BankAccount();
        account.OnDeposit += new BankAccount.BankDelegate(account_OnDeposit);
        account.OnWithdraw += new BankAccount.BankDelegate(account_OnWithdraw);
    }
    private void btnDeposit_Click(object sender, EventArgs e)
    {
        {
            var amount = Convert.ToDecimal(textBox1.Text);
            try { account.Deposit(amount); }
            catch (NegativeDepositException)
            {
                MessageBox.Show("Cannot deposit negative amounts");
            }
        }
    }
    private void btnWIthdraw_Click(object sender, EventArgs e)
    {
        var amount = Convert.ToDecimal(textBox1.Text);
        try { account.Withdraw(amount); }
        catch (NegativeBalanceException)
        {
            MessageBox.Show("Cannot withdraw money that isn't there");
        }
        catch (NegativeWithdrawException)
        {
            MessageBox.Show("Cannot withdraw negative money");
        }
    }
    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();
    }
}
4

1 に答える 1

0

たぶん私は問題を誤解していますが、例外をスローするときにメッセージを渡していません。

そのはず:

 if (a < 0)
    throw new NegativeDepositException("Cannot deposit negative amounts");

それをキャッチするときは、例外の Message プロパティを呼び出す必要があります (これは Exception 基本クラスにあります)。

    catch (NegativeWithdrawException exception)
    {
        MessageBox.Show(exception.Message);
    }
于 2013-10-13T16:30:36.283 に答える