2010-03-19 5 views
31

는 지금까지와 같은 모범 사례가 더있는 우려하고 있습니다 :문자열 매개 변수에 대한 ArgumentException 또는 ArgumentNullException?

public void SomeMethod(string str) 
{ 
    if(string.IsNullOrEmpty(str)) 
    { 
     throw new ArgumentException("str cannot be null or empty."); 
    } 

    // do other stuff 
} 

또는

public void SomeMethod(string str) 
{ 
    if(str == null) 
    { 
     throw new ArgumentNullException("str"); 
    } 

    if(str == string.Empty) 
    { 
     throw new ArgumentException("str cannot be empty."); 
    } 

    // do other stuff 
} 

두 번째 버전은보다 정확한뿐만 아니라, 처음보다 더 성가신 것 같다. 나는 보통 # 1로 가고 있지만, # 2에 대한 논쟁이 있는지 확인해 볼 것입니다.

+0

[가능한 복제본] (http://stackoverflow.com/questions/1355957/should-i-throw-argumentnullexception-if-a-string-is-blank)? 거기서 또 다른 옵션을 제안합니다 : 커스텀'StringNullOrEmptyException'. –

답변

32

두 번째 방법은 실제로 더 정확하다고 말할 수 있습니다. 그렇습니다. 더 귀찮은 방법이지만 항상 모든 방법을 사용하지 않아도되는 방법으로 줄 바꿈 할 수 있습니다. 확장 메서드 일 수도 있습니다 :

str.ThrowIfNullOrEmpty("str"); 


public static void ThrowIfNullOrEmpty(this string value, string name) 
{ 
    if (value == null) 
    { 
     throw new ArgumentNullException(name); 
    } 
    if (value == "") 
    { 
     throw new ArgumentException("Argument must not be the empty string.", 
            name); 
    } 
} 

잠재적으로 유용한 또 다른 형식은 모든 것이 괜찮 으면 원본 문자열을 반환하는 것입니다.

public Person(string name) 
{ 
    this.name = name.CheckNotEmpty(); 
} 

자신의 예외를 던지는에 대한 대안으로 Code Contracts을 사용하고 고려해야 할 또 다른 옵션 : 당신이 뭔가를 작성할 수 있습니다.

5

첫 번째 것을 사용하는 것이 좋습니다. 귀하의 방법이 null 또는 빈 문자열을 기대하지 않는다면, null 또는 empty가 전달되었는지는 중요하지 않습니다.보고 및 오류에 중요하며, 첫 번째 변종이하는 일입니다.

+0

"메서드에서 null 또는 빈 문자열을 예상하지 않으면 null 또는 공백이 전달 된 경우 실제로는 중요하지 않습니다."+1 이것이 내가 생각했던 것입니다. – heisenberg

+2

@ JonSkeet의 답변이 더 정확하고 실용적으로 'ArgumentNullException' 또는 ArgumentException을 던지는 것이 호출자의 관점에서 큰 차이를 만들지는 않지만이 대답에 동의합니다. ArgumentNullException을 넘겨 주면 문제를 해결하는 데 필요한 것의 측면에서 ArgumentException보다 더 많은 정보를 얻지 못합니다. – Matthew

0

다른 가능성 ArgumentOutOfRange 예외 :

호출 된 방법에 의해 정의되는 인자의 값이 허용 값의 범위 밖에있는 경우에 발생되는 예외.

관련 문제