2010-10-19 30 views
6

Tôi đang đối phó với một dự án, trong đó tôi đã viết một ngoại lệ cho mỗi tình huống ngoại lệ có thể xảy ra. Vấn đề là tôi thấy nó "dễ đọc" hơn, nhưng tôi nhận được một số lượng ngoại lệ khác nhau.Thực hành tốt có ngoại lệ cụ thể cho mọi thứ không? Hoặc là tốt hơn để tái sử dụng một ngoại lệ trừu tượng hơn một chút?

Được coi là một thực hành tốt để làm điều đó như thế? Hay tôi nên viết ngoại lệ một chút trừu tượng hơn, để không có quá nhiều?

Cảm ơn bạn rất nhiều vì đã dành thời gian.

+0

Related: http://stackoverflow.com/questions/3948418/why-always-declare-user-defined-exceptions-as-final – ShiDoiSi

Trả lời

4

Điều nào là tốt hơn tùy thuộc vào khả năng mã của bạn sắp bắt các ngoại lệ cụ thể. Nếu bạn chỉ có khả năng bắt (hoặc phân biệt đối xử theo một cách nào đó) thì ngoại lệ chung (superclass) hơn, sau đó có nhiều ngoại lệ (lớp con) cụ thể hơn không đạt được nhiều. Trong trường hợp đó, có lẽ tốt hơn nên xác định ít ngoại lệ hơn và sử dụng thông báo ngoại lệ để thể hiện chi tiết tốt hơn về những gì đã xảy ra.

Mặt khác, nếu ngoại lệ cụ thể đã tồn tại, bạn nên sử dụng chúng. Chỉ cần ném java.lang.Exception hoặc java.lang.RuntimeException là lười biếng, IMO.

THEO UP

Vâng, tôi đang đánh bắt ngoại lệ luôn luôn cụ thể, nhưng vấn đề là, trong "bắt" khác mà tôi sử dụng ngoại lệ cũng cụ thể là loại tương tự (họ có thể tham khảo " cơ sở dữ liệu "chẳng hạn, nhưng chúng không giống nhau). Vì vậy, câu hỏi đặt ra là nếu nó là một điều tốt để làm một "DatabaseException", và sử dụng nó, thay vì "DatabaseConnectionException" và "DatabaseDataException" chẳng hạn, có thể đọc được nhiều hơn, nhưng cuối cùng tôi có hàng triệu ngoại lệ rõ ràng.

Nếu mã của bạn thường xuyên trông như thế này:

try { 
    ... 
} catch (DatabaseConnectionException ex) { 
    // do something 
} catch (DatabaseDataException ex) { 
    // do same thing 
} catch (DatabaseTangoException ex) { 
    // do same thing 
} 

... thì ngoại lệ hạt mịn của bạn không được hỗ trợ. Nhưng nếu có vẻ như thế này:

try { 
    ... 
} catch (DatabaseConnectionException ex) { 
    // do something 
} catch (DatabaseDataException ex) { 
    // do something completely different 
} catch (DatabaseTangoException ex) { 
    // do something totally extraordinary 
} 

... thì có thể các ngoại lệ chi tiết của bạn đang hoạt động cho bạn. Và nếu bạn khai báo ba trường hợp ngoại lệ này là các lớp con của DatabaseDataException, thì bạn có thể xử lý các trường hợp với nhau hoặc riêng rẽ khi các trường hợp ra lệnh.

Thực sự, bạn có thể tự mình đưa ra quyết định của mình, trong ngữ cảnh đơn đăng ký của bạn.

+0

Vâng, tôi bắt luôn những trường hợp ngoại lệ cụ thể, nhưng vấn đề là ở chỗ khác "bắt" tôi cũng sử dụng các ngoại lệ cụ thể tương tự (chúng có thể tham khảo "cơ sở dữ liệu", nhưng chúng không giống nhau). Vì vậy, câu hỏi đặt ra là nếu nó là một điều tốt để làm một "DatabaseException", và sử dụng nó, thay vì "DatabaseConnectionException" và "DatabaseDataException" chẳng hạn, có thể đọc được nhiều hơn, nhưng cuối cùng tôi có hàng triệu ngoại lệ rõ ràng. – raspayu

+0

@raspayu tôi đi với stephen, tạo ra chỉ có một ngoại lệ liên quan đến tên miền và chỉ định thông báo chi tiết cho từng loại error.Always mở rộng ngoại lệ thời gian chạy. đọc java hiệu quả để sử dụng. –

+0

@Raspayu Sử dụng thừa kế. Thực hiện một DatabaseException và có DatabaseConnectionException của bạn mở rộng nó.Bằng cách đó bạn chỉ có thể bắt DatabaseException khi bạn cần phải xử lý chúng giống nhau, hoặc nắm bắt những cái cụ thể nếu bạn cần xử lý cụ thể. –

0

Tại sao không chỉ tạo một số ít ngoại lệ và cho phép họ lấy một chuỗi mô tả trong hàm tạo?

throw new GenericException("Error: problem with...."); 

Và có phương thức toString() in ra chuỗi bạn đã truyền.

+0

Vâng, đó chính xác là câu hỏi, đó là phương pháp hay nhất: rất nhiều các ngoại lệ tự mô tả khác nhau hoặc chỉ một số ít có thể cung cấp cho bạn thông báo lỗi từ những gì đang diễn ra? – raspayu

+0

Đây chỉ là sự đơn giản (http://www.javaworld.com/javaworld/jw-10-2003/jw-1003-generics.html). Toàn bộ điểm làm ngoại lệ có thể mở rộng là để bạn có thể nắm bắt được những cái bạn muốn xử lý và bỏ qua những người khác. – Bronumski

0

Tôi nghĩ rằng thực tiễn tốt là có ngoại lệ cụ thể bất cứ khi nào có thể.

Bằng cách làm theo thực tế này, chúng tôi cung cấp các thông báo lỗi khác nhau dựa trên loại ngoại lệ.

Ngay cả các ngôn ngữ lập trình như Java cũng hỗ trợ khái niệm này, bằng cách cho phép lập trình viên lớp extendException và tạo các lớp con Ngoại lệ của riêng chúng.

Bạn cũng có thể nhận được nhiều thông tin hơn từ câu hỏi sau. Exception Handling Question

+0

khi u mở rộng ngoại lệ nó là một nỗi đau cho một khách hàng, khi u viết một thư viện api, khách hàng hoặc là buộc phải ném lại hoặc xử lý. làm thế nào khách hàng có thể xử lý, ngay cả khi các lớp API ur không biết phải làm gì và ném nó, mở rộng ngoại lệ thời gian chạy thay vì ngoại lệ. –

4

Tôi khuyên bạn nên có DomainException trừu tượng (tên miền phản ánh tổ chức của bạn hoặc lớp ứng dụng trong đó vấn đề), tất cả ngoại lệ cụ thể của bạn sẽ mở rộng.

Sau đó, bạn chỉ có thể nắm bắt DomainException để nói rằng đây là sự cố với mã của bạn và sau đó tinh chỉnh nếu cần.

+0

+1 cho DomainException. Tôi cũng có xu hướng làm điều này. –

+0

Điều thú vị! Chưa từng nghĩ về điều đó trước đây! Cảm ơn vì lời khuyên! – raspayu

3

Bloch, J., 2008. Effective Java. 2nd ed:

mục 60: Favor việc sử dụng các ngoại lệ chuẩn

Tái sử dụng ngoại lệ từ trước có nhiều lợi ích. Đứng đầu trong số này, giúp API của bạn dễ học và sử dụng vì nó phù hợp với các quy định được thiết lập mà các lập trình viên là đã quen thuộc. Thứ hai gần là rằng các chương trình sử dụng API của bạn là dễ đọc hơn vì chúng không phải là lộn xộn với các ngoại lệ không quen thuộc. Cuối cùng (và ít nhất), ít ngoại lệ hơn lớp học có nghĩa là một bộ nhớ nhỏ hơn dấu chân và ít thời gian hơn khi tải các lớp .

1

Bạn có thể mở rộng ngoại lệ không có nghĩa là bạn nên làm như vậy. Câu trả lời của Dogbane đưa ra lý do chính đáng cho việc sử dụng các ngoại lệ tiêu chuẩn. (Lưu ý rằng anh ta sử dụng ngoại lệ "chuẩn", không phải là "chung chung"! Sử dụng như một ngoại lệ tiêu chuẩn cụ thể như bạn có thể tìm thấy.)

Tôi tin rằng bạn nên sử dụng phân lớp ngoại lệ của riêng mình khi cả hai điều kiện này đều đúng :

  • Bạn muốn làm điều gì đó cụ thể khi bạn nắm bắt một loại ngoại lệ nhất định; sử dụng một lớp con cụ thể trong trường hợp đó cho phép bạn nắm bắt nó trong khi cho phép các ngoại lệ khác bong bóng lên mà không có vấn đề.
  • Không có ngoại lệ chuẩn nào bao gồm danh mục của bạn với độ chính xác đủ.
Các vấn đề liên quan