2012-06-22 10 views
0

C#으로 된 프로젝트가 UI 레이어와 비즈니스 레이어로 나뉘어져 있습니다. 기본적으로 계정을 선택하고 입금 번호를 입력 할 수있는 양식이 있습니다. 확인 버튼을 클릭하면 DepositTransaction.cs가 트랜잭션을 처리합니다. 그러나, 상기 시도, 양식에 오류를 통과하지 않는 DepositTransactionC# 클래스에서 던져진 예외를 C# 폼에 전달하는 방법

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

에 대한

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

그리고 지금 샘플 코드 : 여기

는 DepositForm에 대한 샘플 코드입니다. 예외가 처리되지 않았다고 말하는 프로그램이 충돌합니다.

나는 오류를 전달하는 방법을 언급 한 stackoverflow에 대한 또 다른 질문은 단지 throw:을 사용한다는 것을 알았고 그 오류는이 클래스를 (내 경우에는 양식에서) 호출 한 클래스에 전달되며 형태.

내가 뭘 잘못하고 있니? 는

+1

'InvalidTransactionAmtNegativeException (message);을 (를) 던져보십시오.' 오류 메시지를 설정합니다. – Prasanth

+0

예외의 스택 추적을 게시해야합니다. – tallseth

+0

DoTransaction은 buttonOK_Click을 catch하지 않는 예외를 throw 할 가능성이 큽니다. 가능한 모든 예외를 잡으려면 catch (Exception ex)를 추가해야합니다 (다른 곳에서 마지막 기회 핸들러가없는 경우). 그런데 DoTransaction의 끝에서 catch 절은 완전히 불필요합니다. – holmes

답변

2

그것은 단지 형 InvalidTransactionAmtNegativeExceptionAccountInactiveException의도 인 예외가 발생되고 있음을 의미합니다 감사합니다. 새로운 캐치 블록을 추가하십시오.

catch (Exception ex) { 
    throw; 
} 

편집 : 마지막으로 오게해야합니다.

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

당신의 DoTransaction 방법 내에서 발생 될 수있는 다른 예외를 잡을 것 catch 블록에서 지정한 특정 예외가 적용되지 않습니다. 결국 일반적인 예외를 잡으십시오. 그것은 좋은 습관입니다.

0

그것은 당신의 예외 것 같다 : 그냥 사용하는 일반 catch 블록을 당신은 UI에서 모든 catch 블록에 코드를 반복하는