2010-03-19 26 views
31

Viễn như thông lệ tốt nhất là có liên quan, mà là tốt hơn:ArgumentException hoặc ArgumentNullException cho tham số chuỗi?

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

    // do other stuff 
} 

hoặc

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 
} 

Phiên bản thứ hai có vẻ chính xác hơn, mà còn nhiều rườm rà hơn trước. Tôi thường đi với # 1, nhưng tôi đã kiểm tra nếu có một đối số được thực hiện cho # 2.

+0

[Có thể trùng lặp] (http://stackoverflow.com/questions/1355957/should-i-throw-argumentnullexception-if-a-string-is-blank)? Ở đó, họ cũng đề xuất một tùy chọn khác: tùy chỉnh 'StringNullOrEmptyException'. –

Trả lời

32

Tôi muốn nói cách thứ hai thực sự chính xác hơn - có, nó cồng kềnh hơn nhưng bạn luôn có thể quấn nó theo một phương pháp để tránh phải làm việc đó mọi lúc. Nó thậm chí có thể là một phương pháp mở rộng:

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

Một dạng khác có khả năng hữu ích là một chuỗi trả về chuỗi gốc nếu mọi thứ đều ổn. Bạn có thể viết một cái gì đó như thế này:

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

Một tùy chọn khác để xem xét đang sử dụng Code Contracts thay thế cho việc ném ngoại lệ của riêng bạn.

5

Tôi khuyên bạn nên sử dụng thẻ đầu tiên. Nếu phương thức của bạn không mong đợi chuỗi rỗng hoặc rỗng nó thực sự không quan trọng nếu null hoặc rỗng được thông qua - quan trọng để báo cáo và lỗi và đó là những gì biến thể đầu tiên.

+0

"Nếu phương pháp của bạn không mong đợi chuỗi rỗng hoặc rỗng, nó thực sự không quan trọng nếu null hoặc trống đã được thông qua" +1 vì điều này là khá nhiều chính xác những gì tôi đã suy nghĩ. – heisenberg

+2

Tôi đồng ý với câu trả lời này, mặc dù câu trả lời của @ JonSkeet là chính xác hơn, thực tế, việc ném 'ArgumentNullException' hoặc' ArgumentException' không tạo sự khác biệt lớn so với quan điểm của người gọi. Việc chuyển 'ArgumentNullException' không cung cấp cho bạn thêm thông tin nào ngoài' ArgumentException' về những gì cần thiết để khắc phục sự cố. – Matthew

0

Một khả năng khác là ArgumentOutOfRange ngoại lệ:

Trường hợp ngoại lệ được ném khi giá trị của một cuộc tranh cãi nằm ngoài phạm vi cho phép của các giá trị theo quy định của phương pháp gọi.

Các vấn đề liên quan