2010-06-04 53 views
26

Khi thiết kế thư viện lớp học, Khi bạn tạo phương thức, khi nào bạn quyết định ném ngoại lệ hoặc trả về boolean.Khi trả lại bool, hãy ném ngoại lệ và ngoại lệ nào để ném

Ví dụ:

public class MathHelper 
{ 
    public int Divide(int x, int y) 
    { 
     if(y == 0) 
     { 
      throw new DivideByZeroException("Cannot Divide by Zero"); 
     } 
     return x/y;  
    } 
} 

Đây là trường hợp đơn giản, nhưng sau đó bạn bắt đầu tạo các phương pháp phức tạp hơn.

Bạn thích cái nào hơn?

public void Parse(TextReader reader, string delimeter) 
{ 
    if(reader == null) 
    { 
     throw new ArgumentNullException("The reader cannot be null"); 
    } 
    if(String.IsNullOrEmpty(delimeter)) 
    { 
     throw new ArgumentNullException("The delimeter cannot be null"); 
    } 
} 

public bool Parse(TextReader reader, string delimeter) 
{ 
    if(reader == null) 
    { 
     logger.Error("Parse failed with null reader"); 
     return false; 
    } 
    if(String.IsNullOrEmpty(delimeter)) 
    { 
     logger.Error("Parse failed with null delimeter"); 
     return false; 
    } 
} 

Trả lời

29
  • Exceptions nói chung là con đường để đi cho những thứ mà thất bại không mong đợi như một tùy chọn.

  • Giá trị trả lại Boolean là cách để đi cho những điều mà đôi khi có thể là kết quả mong đợi.

Vì vậy, trong ví dụ của bạn, tôi muốn nói là có ngoại lệ.

6

tài liệu Java có một cái gì đó để nói về cách tiêu chuẩn để kiểm tra điều kiện tiên quyết:

https://docs.oracle.com/javase/8/docs/technotes/guides/language/assert.html#preconditions

Đó là, nâng cao một ngoại lệ nếu nó công cộng, và sử dụng khẳng định nếu nó là tư nhân.

+0

Tôi thực sự thích câu trả lời này, bởi vì nếu bạn sử dụng nó chỉ dành cho thư viện nội bộ của bạn, ném một ngoại lệ là tốn kém. –

+0

liên kết đã cho cho tài liệu bị hỏng. – chammu

+0

@chammu Tôi thường có thể truy cập vào nó. – KnorxThieus

1

Tôi thích cách C# thực hiện những gì bạn đang yêu cầu trong ví dụ của bạn. Bạn có thể nhận được một phương thức (int.Parse) trả về một số nguyên hoặc ném vào lỗi. Bạn cũng có một phương thức (int.TryParse) điền một đối số tham chiếu được cung cấp với giá trị số nguyên và trả về một mã trạng thái boolean. Bằng cách này, nếu bạn muốn để nhận và ngoại lệ, bạn thực hiện. Nếu bạn muốn xử lý nội dòng lỗi bằng cách sử dụng điều kiện, đó cũng là một tùy chọn.

0

Trong khi câu trả lời được chấp nhận là một số lời khuyên chung tốt, có một số trường hợp tôi thích (kiểm tra) ngoại lệ ngay cả khi phương pháp boolean đủ điều kiện:

  • loại khác nhau của thất bại (dự kiến) mà đòi hỏi phải xử lý khác nhau. Các giải pháp thay thế là các mã trạng thái int sẽ yêu cầu các hằng số thích hợp và các mã trạng thái mã có thể tốt hơn nhưng vẫn cần kiểm tra rõ ràng.

  • Tuyên truyền ngoại lệ. Đôi khi bạn phát hiện sự thất bại ở lớp mô hình, nhưng chỉ có thể xử lý nó trong khung nhìn, đó là cách thức trong chuỗi. Vì vậy, thay vì làm cho tất cả các hàm trả về boolean và truyền giá trị trả về, hãy sử dụng hành vi mặc định của ngoại lệ và bắt chúng ở lớp trên cùng.