2014-02-07 4 views
2

제공된 인수가 잘못된 경우 여러 인수를 허용하는 메서드로 어떤 예외를 throw해야합니까 ? 일례로서 잘못된 인수 쌍에 대한 예외

는 작업을 완료하는 어레이/수집하는 경우, 그들은 동일한 크기 여야 ( f1f2 사이에 관계 유사성 달려있다
public Bar DoSomething(Foo f1, Foo f2) 
{ 
    //implementation... 
} 

고려; 선수 경우, 그들이 있어야 같은 팀/반대 팀 등).

각 인수는 작업에 유효한 인수이지만 함께 사용할 수 없습니다. 예 :이 인수 중 하나가 잘못보다는 인수 한 쌍 함께 유효 있다는 것을 의미하기 때문에

public MatchResult PlayMatch(Player a, Player b) 
{ 
    if(a.Team == b.Team) 
    { 
    //Throw exception here, since players must be on different teams 
    } 

    //Play match, determine winner 
} 

ArgumentException을 던지는는 잘못된 것 같다.

+0

'MatchResult'에 개체가 유효하지 않음을 나타내는 값을 포함 할 수 있습니까? – 48klocs

+0

ArgumentException이 유효하지 않은 이유는 무엇입니까? 인수 "b.Team"은 "a.Team"과 같아서는 안됩니다. 그것이 "b"가 잘못된 인수 인 이유입니다. –

답변

2

예외를 throw 할 필요는 없습니다. 내 견해로, 이것은 심지어 당신의 매칭 로직의 깊은 부분이기 때문에 예외를 던져서는 안된다. 난 그냥 (0 또는 당신이 무엇을하든 반환)과 일치하는 실패를 대신 문서 에서이 사실을 언급 - 뭔가 "다른 팀에서 두 선수를 비교할 수 있습니다." 같은 팀의 선수를 비교하면 실패하게됩니다. 인수가 전달되는에 문제가있는 것처럼

+1

여기에 동의합니다. 이것은 예외 규칙이 아니라 논리 규칙입니다. 예외를 사용하여 응용 프로그램 논리를 전달하지 마십시오. 가능한 한 일찍 입력 내용을 확인하고 가능한 경우 오류를 표시하십시오. –

+0

메서드 및 반환 값은 호출자가 처리 할 준비가되지 않은 경우에만 문제 조건이 예외가 발생하도록 설계해야합니다. 호출자가 조건을 처리 할 수 ​​없으면 메서드 내에서 throw하면 호출자가 코드를 테스트하여 혼란스럽게 할 필요가 없습니다. try/do 패턴은 수반되는 코드 중복을 제외하면 훌륭합니다. 중복되지 않는 try/do 패턴에 대한 표준 규칙이 있었으면합니다. – supercat

+0

@Ahmedilyas 아직 개발 초기에 로직이나 버그의 결함을 추적하는 데 도움이됩니다. –

1

ArgumentException이 여기 나을 당신은 항상 당신의 throw 문에 메시지를 추가 할 수 있습니다.

throw new ArgumentException("Players can't be on the same team!"); 

그것은 예외를 throw하는 것은 좋은 생각이 아마 아니다 여기 사용자가 뭔가 잘못한 경우. 저는 개인적으로 예외가 실제로 사용자가 제어 할 수없는 케이스를 잡아야한다고 생각합니다 (중간에 파일 읽기가 실패한 것처럼). 그러면 프로그램을 정상적으로 실패 할 수 있습니다. 일종의 오류 메시지를 표시하고 null을 반환하고 사용자가 다시 팀을 선택하도록하는 것일 수 있습니다.

public MatchResult PlayMatch(Player a, Player b) 
{ 
    if(a.Team == b.Team) 
    { 
     MessageBox.Show("Players must be on different teams!"); 
     return null; 
    } 

    //Play match, determine winner 
}