0

UIレイヤーとビジネスレイヤーに分割されたc#のプロジェクトがあります。基本的に口座を選択して入金番号を入力できるフォームがあります。[OK]ボタンをクリックすると、DepositTransaction.csがトランザクションを処理します。

DepositFormのサンプルコードは次のとおりです。

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();
        }
    }

そして今、DepositTransactionのサンプルコード

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;
        }
    }

ただし、上記を試しても、エラーはフォームに渡されません。例外が処理されなかったと言ってプログラムをクラッシュさせるだけです。

エラーを渡す方法は単に使用することthrow:であり、そのエラーはこのクラス(私の場合はフォーム)を呼び出したクラスに渡され、フォームで処理されるというスタックオーバーフローに関する別の質問を見ました。

私は何が間違っているのですか?ありがとうございました

4

3 に答える 3

2

これは、 InvalidTransactionAmtNegativeExceptionタイプでもAccountInactiveExceptionタイプでもない例外がスローされていることを意味します。新しいキャッチブロックを追加する

catch (Exception ex) {
    throw;
}

編集:あなたはそれを最後に来させるべきです。DoTransactionメソッド内でスローされる可能性のある他の例外をキャッチします

于 2012-06-22T04:25:02.693 に答える
0

UIのすべてのcatchブロックでコードを繰り返していますが、一般的なcatchブロックを使用するだけです。

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();
        }
    }
于 2012-06-22T04:27:24.503 に答える
0

あなたの例外は、catchブロックで指定した特定の例外に該当しないようです。したがって、最後に一般的な例外をキャッチします。それは良い習慣です。

于 2012-06-22T04:29:00.587 に答える