2012-10-16 42 views
7

Tôi có một số câu hỏi liên quan đến xử lý ngoại lệ trong Java. Tôi đọc một chút về nó và có một số hướng dẫn mâu thuẫn.Thực hành tốt cho các ngoại lệ Java xử lý

Best Practices for Exception Handling

Hãy cùng xem qua bài viết đề cập:

Nó nói rằng một thường nên tránh sử dụng ngoại lệ kiểm tra nếu "mã khách hàng không thể làm bất cứ điều gì". Nhưng nó có ý nghĩa gì? Hiển thị thông báo lỗi trong GUI đủ lý do cho bong bóng lên kiểm tra ngoại lệ? Nhưng nó sẽ buộc lập trình GUI nhớ để bắt RuntimeExceptions và con cháu của họ để hiển thị thông tin lỗi tiềm năng.

Chế độ xem thứ hai được trình bày trong bài viết này là người ta nên tránh phát minh ra các lớp ngoại lệ của riêng trừ khi tôi muốn thực hiện một số trường/phương thức hải quan trong đó. Tôi thường không đồng ý với điều này, thực hành của tôi ngày hôm nay hoàn toàn ngược lại: tôi đã bao gồm các ngoại lệ trong cấu trúc ngoại lệ của mình để phản ánh các mục tiêu được nhận ra bởi các lớp tôi viết, ngay cả khi chúng chỉ mở rộng Ngoại lệ mà không thêm bất kỳ phương thức mới nào. Tôi nghĩ rằng nó giúp để xử lý chúng linh hoạt hơn trong các lớp cao hơn khi ném cộng với nó nói chung là rõ ràng hơn và dễ hiểu cho lập trình viên sẽ sử dụng các lớp này.

Tôi đã triển khai một số mã hôm nay 'cách mới' được trình bày trong bài viết đưa ra RuntimeException ở đây và ở đó, sau đó tôi để Sonar phân tích nó. Để làm tôi bối rối hơn nữa, Sonar đã đánh dấu RuntimeExceptions của tôi là các lỗi chính với một thông báo như "Tránh ném các loại ngoại lệ của root, wrap'em trong các kiểu của riêng bạn".

Vì vậy, có vẻ khá gây tranh cãi, bạn nghĩ sao?

Tôi cũng nghe nói từ một trong những khách hàng tiềm năng ngày nay chỉ gói các ngoại lệ là xấu, 'bởi vì nó là một hoạt động thực sự tốn kém cho JVM'. Đối với tôi, ở phía bên kia ném SQLExceptions hoặc IOExceptions ở khắp mọi nơi trông giống như một chút phá vỡ đóng gói ..

Vậy thái độ chung của bạn với những câu hỏi tôi đã trình bày ở đây là gì?

  1. Khi quấn ngoại lệ trong các loại của riêng tôi, khi tôi không nên làm điều này?

  2. Đâu là điểm của 'khách hàng không thể làm gì về điều này, hãy ném ngoại lệ thời gian chạy? '

  3. Điều gì về vấn đề hiệu suất?

+0

Thật không may điều này không mang tính xây dựng cho SO theo Câu hỏi thường gặp. Bạn có thể muốn thử programmers.stackexchange.com - được nói, mua 'Java hiệu quả' bởi Joshua Bloch. Bất cứ ai nghiêm túc về Java nên sở hữu một bản sao. –

+0

Tôi chắc chắn sẽ chuyển nó sang Programmers.SE nếu tôi có thể. Đã có thời gian khi chúng ta có thể làm điều đó? Hay tôi chỉ luôn mong chờ thời gian đó? –

+0

https://today.java.net/pub/a/today/2006/04/06/exception-handling-antipatterns.html là một danh sách tốt về thực hành tốt – bla

Trả lời

2

Dường như công nghệ cao của bạn, thường xuyên, đã thoát khỏi vai trò nhà phát triển của anh ấy vì anh ấy không giỏi.

lời khuyên của tôi sẽ là:

  • thích ngoại lệ thời gian chạy qua kiểm tra ngoại lệ, đặc biệt là nếu bạn không phải là khách hàng duy nhất của API của bạn. Sử dụng một ngoại lệ đã kiểm tra sẽ buộc mọi máy khách xử lý ngoại lệ, ngay cả khi nó không thể làm bất cứ điều gì về nó. Nếu đây thực sự là điều bạn muốn làm (tức làbuộc người gọi xử lý nó), sau đó một ngoại lệ được kiểm tra là những gì bạn muốn.
  • nếu điều duy nhất khách hàng có thể thực hiện khi một ngoại lệ xảy ra là hiển thị thông báo lỗi chung chung hoặc ít hơn như "oops, một cái gì đó xấu xảy ra, vui lòng thử lại hoặc quay lại trang chào mừng", sau đó chắc chắn sử dụng ngoại lệ thời gian chạy. Hầu hết các khung trình bày cung cấp một cách để sử dụng một trình xử lý lỗi chung.
  • chắc chắn sử dụng ngoại lệ được liên kết với lớp trừu tượng của bạn. Ném một SQLException từ một dịch vụ cấp cao là không đủ. Sử dụng các loại ngoại lệ hiện có khi chúng thích hợp (như IllegalArgumentException để báo hiệu một đối số bất hợp pháp). Nếu không, hãy bọc ngoại lệ cấp thấp vào một loại ngoại lệ thích hợp cao hơn. Điều gì là tốn kém là để ném một ngoại lệ. Cho dù nó kết thúc tốt đẹp khác hay không không quan trọng nhiều. Và nó chỉ nên xảy ra một cách đặc biệt.
+0

Nhưng theo như tôi hiểu, gói yêu cầu tái ném truyền ngoại lệ 'cũ' như một tham số hàm tạo cho ngoại lệ 'mới'. Không phải là chi phí bắt và ném lại 200% chi phí ban đầu? –

+3

ném một ngoại lệ là tốn kém hơn một 'if', nhưng nó không phải là một hog hiệu suất. Không đủ điều kiện so với bất kỳ cuộc gọi liên tục hoặc hoạt động IO nào. Đầu tiên làm điều đó đúng, sau đó tối ưu hóa chỉ khi cần thiết, và nếu bạn đã đo lường rằng đây là nguyên nhân của vấn đề hiệu suất. Nó sẽ không được. –

+0

200% của một vài hướng dẫn vẫn là một vài hướng dẫn. –